本帖最后由 mfkyygt 于 2014-5-26 22:11 编辑
最近想把汽车的手动温控改为自动温控,用tiny13驱动1602,遇到查表显示字符串时经常重复显示的问题,不知是否tiny13的flash字节限制原因?哪位大侠有用过tiny13驱动1602的,编程上有哪些注意事项,请指教。
先打个窝,稍后回办公室了再上代码和图,谢谢。
回来了,上代码。。。
//---- LCD显示字符表 ----
const unsigned char num[] ={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //0~9
const unsigned char str1[] ={0x53,0x45,0x54,0x20,0x54,0x3A,0x20}; //显示 “SET T: ”
const unsigned char str2[] ={0x4E,0x4F,0x57,0x20,0x54,0x3A,0x20}; //显示“NOW T: ”
//---- LCD初始化 ----
void lcd_init()
{
lcd_wcmd(0x38); //设置为8位数据,双列,5*7字形
lcd_wcmd(0x0C); //开启显示屏,关光标,光标不闪
lcd_wcmd(0x06); //显示地址递增
lcd_wcmd(0x01); //清屏
}
//---- LCD写指令 ----
void lcd_wcmd(unsigned char cmd)
{
delay_ms(5); //延时,相当于忙检测
CLR(PORTB,PB3); //rs=0,选择指令寄存器
send(cmd); //164送数据
delay_ms(1);
SET(PORTB,PB4); //LCD使能产生下降沿
CLR(PORTB,PB4);
}
//---- LCD写数据 ----
void lcd_wdata(unsigned char dat)
{
delay_ms(5); //延时,相当于忙检测
SET(PORTB,PB3); //rs=1,选择数据寄存器
send(dat); //164送数据
delay_ms(1);
SET(PORTB,PB4); //LCD使能产生下降沿
CLR(PORTB,PB4);
}
//---- 显示提示内容 ----
//void show_lcd(uint t1,uint t2,uint t3,uint t4)
void show_lcd(uint t1,uint t2)
{
unsigned int j;
lcd_wcmd(0x80); //第一行首地址,显示 SET T: 正常
for (j=0;j<7;j++)
{
lcd_wdata(str1[j]);
delay_ms(2);
}
lcd_wcmd(0xC0); //第二行首地址,目标是显示 NOW T: 但实际却显示了 NOWW,不正常
for (j=0;j<7;j++)
{
lcd_wdata(str2[j]);
delay_ms(2);
}
//----
lcd_wcmd(0x87); //设定温度显示位置
lcd_wdata(num[t1]); //显示十位
lcd_wdata(num[t1]); //显示个位
lcd_wdata(0x2E); //显示小数点
lcd_wdata(num[t2]); //显示小数位
//----
lcd_wcmd(0xC7); //设定温度显示位置
lcd_wdata(num[t1]); //显示十位
lcd_wdata(num[t1]); //显示个位
lcd_wdata(0x2E); //显示小数点
lcd_wdata(num[t2]); //显示小数位
}
/*==== 主程序 ====*/
void main()
{
PORTB = 0xFF; //输出高电平
DDRB = 0xFE; //11111110,PB0设为输入
lcd_init(); //LCD初始化
//show_lcd(5,6,7,8); //LCD显示赋值内容
show_lcd(5,8); //LCD显示赋值内容
while (1)
{;}
}
奇怪的是,当我把lcd_wdata(num[t1]); 修改为lcd_wdata(num[5]);直接指向数字而不是用变量时,显示是正常的
所以请教tiny13是否不能定义太多的变量和数组? 表述有点乱,望能理解。。。
|