论坛风格切换切换到宽版
  • 4711阅读
  • 13回复

12864问题解决了。继续求助ICCAVR问题(9楼) [复制链接]

上一主题 下一主题
离线永远的FM
 
发帖
12110
只看楼主 倒序阅读 0楼 发表于: 2009-03-01
12864液晶屏在连续显示一行半角英文或数字时,显示地址是芯片内部自动增加的不用人为干预。如果在选择显示地址时输入0x81,那显示位置是屏幕第二个全角的位置。
现在有个问题:

如果我想单独在屏幕第二个半角位置(即地址的80h和81h之间那个地方)显示一个半角的ascii文字,要怎么操作????????
离线河马漫步
发帖
1498
只看该作者 1楼 发表于: 2009-03-01
应该可以加个空格吧...
离线appcat
发帖
145
只看该作者 2楼 发表于: 2009-03-01
楼上正解!
往80h的地址写入一个空格,紧接着再写入你要的ascii字符。
离线BG4UVR
发帖
11287
只看该作者 3楼 发表于: 2009-03-01
读出80h的数据,然后写入80h,再写81h
离线appcat
发帖
145
只看该作者 4楼 发表于: 2009-03-01
st7920芯片的屏,串行读不出数据的,一般都是在ram中保持一份镜像。
离线永远的FM
发帖
12110
只看该作者 5楼 发表于: 2009-03-01
明白2 3楼的意思了。那我要显示个变化的数字怎么办????
离线appcat
发帖
145
只看该作者 6楼 发表于: 2009-03-01
要显示变化的数据,那就要在数据发生变化时写入,如果要考虑保留原来屏幕其他位置的内容,一般两种方式,一是读取屏的ram回来,在要写的地方填入数据,然后写回去。第二种是在ram中保持一份和屏当前显示一样的数据,每次需要修改显示内容时直接修改这个ram中的镜像,然后做个定时器,定时把这个镜像数据写入屏的ram。
实际工作中,基本都会用第二种办法,虽然耗点ram,但是速度快,程序控制简单,还有就是类似st7920的屏,串行方式根本读不出内部数据。
离线永远的FM
发帖
12110
只看该作者 7楼 发表于: 2009-03-01
'
要显示变化的数据,那就要在数据发生变化时写入,如果要考虑保留原来屏幕其他位置的内容,一般两种方式,一是读取屏的ram回来,在要写的地方填入数据,然后写回去。第二种是在ram中保持一份和屏当前显示一样的数据,每次需要修改显示内容时直接修改这个ram中的镜像,然后做个定时器,定时把这个镜像数据写入屏的ram。
实际工作中,基本都会用第二种办法,虽然耗点ram,但是速度快,程序控制简单,还有就是类似st7920的屏,串行方式根本读不出内部数据。
'

已经解决了。现在按照要求显示了。谢谢提醒。
离线永远的FM
发帖
12110
只看该作者 8楼 发表于: 2009-03-01
继续问个关于iccavr的问题

现在在m8的pc3和pc4有2个接地的按钮。像编写c代码,当pc3按下时变量i加1;pc4按下,i减1。一直没办法写出能用的程序。请大家指点。
离线appcat
发帖
145
只看该作者 9楼 发表于: 2009-03-02
//扫描一次键盘,如果有按键且不是重复的,则返回键值
unsigned char getkey(unsigned char *lastkey, unsigned char *pressed)
{
    unsigned char key, keymask;
    //这里扫描一次键盘,如果有键按下则获得键值

    delay_ms(10);
    keymask = 0b11101111;
    portc = 0xff;
    portc &= keymask;
    #asm("nop");
    key = pinc;
    if ((key & 0b00001111) == 0b00001111)   //没有键按下
    {
          *pressed = 0;
          keymask = 0b11011111;
          portc = 0xff;
          portc &= keymask;
          #asm("nop");
          key = pinc;
          if (((key & 0b00001111) == 0b00001111))
          {
                *pressed = 0;
                keymask = 0b10111111;
                portc = 0xff;
                portc &= keymask;
                #asm("nop");
                key = pinc;
                if (((key & 0b00001111) == 0b00001111))
                {
                    *pressed = 0;
                    keymask = 0b01111111;
                    portc = 0xff;
                    portc &= keymask;
                    #asm("nop");
                    key = pinc;
                    if (((key & 0b00001111) == 0b00001111))
                    {
                          *pressed = 0;    
                    }
                    else
                    {
                          *pressed = 1;
                    }
                }
                else *pressed = 1;
          }
          else *pressed = 1;
    }
    else *pressed = 1;    
    if ((*pressed) && (key != *lastkey))
    {
          *lastkey = key;
          //pressed = 0;
          beep();
          return key;
    }
    else
    {
          if (!*pressed)
          {
                *lastkey = 0;
          }
               
    }
    return 0;
}

==================================
上面是自己写的键盘函数,用cvavr,不会iccavr,
非阻塞函数,运行一次扫描一遍,根据函数返回确定是否
有键按下以及键值。其中lastkey是全局变量,可以用来
抗抖动,或者结合定时器来识别按键的长按还是短按。
离线BG4XCR
发帖
33381
只看该作者 10楼 发表于: 2009-03-02
都说完了。
离线永远的FM
发帖
12110
只看该作者 11楼 发表于: 2009-03-02
10楼朋友提供的代码太详细了。不过有点看不懂。
有没有简单一些的代码,现在防抖,防重复按下那些都不管了,只需要按下跳转执行的功能。
离线appcat
发帖
145
只看该作者 12楼 发表于: 2009-03-02
10楼的代码其实是一个4×4的键盘扫描程序。如果只有两个io,只要判断高低电平,那可以非常简单。
大概写一下,用cvavr的语法,不保证没错误,就是个思路

ddrc=0b11100111;
portc=0b00011000;


.......
while (1)
{
    if (!(pinc & 0b00001000))
    {
        i++;
        break;
    }
    if (!(pinc & 0b00010000))
    {
        i--;
        break;
    }
}
....................

思路就是一个死循环,反复检查按键状态,如果没有按键按下,就一直循环,如果发现按键按下,就进行相应的操作,并且退出循环继续向下执行。
离线永远的FM
发帖
12110
只看该作者 13楼 发表于: 2009-03-03
明白了!!!!刚刚按照上面写了个程序,调试通过。