找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2131|回复: 3
收起左侧

12864 7920芯片带中文字库显示实验 输出乱码

[复制链接]
ID:541856 发表于 2019-5-19 09:29 | 显示全部楼层 |阅读模式
  1. //12864液晶的试验程序,驱动芯片为ST7920
  2. //目标板为TS8900-M128
  3. //驱动方式-并口
  4. //J1,J15,J8短路块位于左侧
  5. //调节RV1电位器调整对比度
  6. //注意:因为厂家不同液晶的19脚和20脚(背光)有时会不同,导致背光不亮,需要注意。

  7. #include <iom128v.h>
  8. #include <string.h>

  9. #define uchar unsigned char
  10. #define uint unsigned int

  11. #define RS (1<<0)
  12. #define RW (1<<1)
  13. #define EN (1<<2)

  14. //延时函数
  15. void s_ms(uint ms)
  16. {
  17.         for(;ms>1;ms--);
  18. }        
  19. //此处定义字符串
  20. char text_1[]="液晶测试第一行";
  21. char text_2[]="液晶测试第二行";
  22. char text_3[]="液晶测试第三行";
  23. char text_4[]="液晶测试第四行";

  24. //写数据
  25. void WriteDataLCM(unsigned char WDLCM)
  26. {
  27.         //ReadStatusLCM(); //检测忙
  28.         s_ms(100);
  29.         PORTC|=RS;       //RS=1   
  30.         s_ms(100);
  31.         PORTC&=~RW;      //RW=0
  32.         s_ms(100);
  33.         PORTC|=EN;       //EN=1
  34.         s_ms(100);
  35.         PORTA=WDLCM;     //输出数据
  36.         s_ms(100);
  37.         PORTC&=~EN;      //EN=0
  38.         s_ms(100);
  39. }

  40. //写指令
  41. void WriteCommandLCM(unsigned char WCLCM)
  42. {
  43.         //ReadStatusLCM(); //根据需要检测忙
  44.         s_ms(100);
  45.         PORTC&=~RS;      //RS=0
  46.         s_ms(100);
  47.         PORTC&=~RW;      //RW=0
  48.         s_ms(100);
  49.         PORTC|=EN;       //EN=1
  50.         s_ms(100);
  51.         PORTA=WCLCM;     //输出指令
  52.         s_ms(100);
  53.         PORTC&=~EN;      //EN=0
  54.         s_ms(100);
  55. }

  56. //读状态:检测忙
  57. void ReadStatusLCM(void)
  58. {
  59.         uchar temp;
  60.     uchar flag = 1;
  61.     while(flag==1)
  62.         {
  63.             DDRA=0x00;      //端口B改为输入
  64.                 PORTA=0xff;   
  65.                 s_ms(100);
  66.                 PORTC&=~RS;     //RS=0
  67.                 s_ms(100);
  68.                 PORTC|=RW;      //RW=1
  69.                 s_ms(100);
  70.                 PORTC|=EN;      //EN=1
  71.                 s_ms(1000);
  72.                 temp = PINA;    //读端口B
  73.                 s_ms(1000);
  74.                 DDRA=0xff;      //端口B改为
  75.                 s_ms(100);
  76.                 PORTC&=~EN;     //EN=0
  77.                 s_ms(100);
  78.                 if(temp>>7==0)
  79.                 flag = 0;
  80.         }
  81. }

  82. //LCM初始化
  83. void LCMInit(void)
  84. {
  85.         WriteCommandLCM(0x38);    //三次显示模式设置,不检测忙信号
  86.         s_ms(1000);
  87.         WriteCommandLCM(0x38);
  88.         s_ms(1000);
  89.         WriteCommandLCM(0x38);
  90.         s_ms(1000);
  91.         WriteCommandLCM(0x38);    //显示模式设置,开始要求每次检测忙信号
  92.         WriteCommandLCM(0x08);    //关闭显示
  93.         WriteCommandLCM(0x01);    //显示清屏
  94.         WriteCommandLCM(0x06);    //显示光标移动设置
  95.         WriteCommandLCM(0x0C);    //显示开及光标设置
  96. }

  97. //按指定位置显示一串字符
  98. //液晶显示:汉字为16*16,字母及数字为8*16,此次显示的文本
  99. //          从第一行第一列开始,依次向左,如果想在不同的
  100. //          位置显示,只需修改相应的行值即可。液晶显示
  101. //          完毕后,转入语音文本发送。
  102. //DisplsyList(X,DData)函数:X为0x80在第一行显示;X为0x90在
  103. //                        第二行显示;X为0x88在第三行显示;X为0x98在
  104. //                        第四行显示;DData为显示数组。
  105. void DisplayList(unsigned char X,char *DData)
  106. {
  107.         unsigned char length;
  108.         unsigned char i=0;
  109.         char *p;
  110.         p = DData;
  111.         length = strlen(p);
  112.         WriteCommandLCM(0x08);
  113.         WriteCommandLCM(X);
  114.         WriteCommandLCM(0x06);
  115.         WriteCommandLCM(0x0C);
  116.         WriteCommandLCM(X);
  117.         for(i=0;i<length;i++)
  118.         {
  119.                 WriteDataLCM(DData[i]);
  120.                 i++;
  121.                 WriteDataLCM(DData[i]);
  122.         }
  123. }

  124. //主函数
  125. void main(void)
  126. {
  127.     //端口初始化
  128.         DDRA=0xff;
  129.         PORTA=0xff;
  130.         DDRC=0xff;
  131.         PORTC=0xff;
  132.         DDRD=0xff;
  133.         PORTD=0x00;
  134.         
  135.         s_ms(200);
  136.         s_ms(200);  
  137.         LCMInit(); //LCM初始化   //液晶初始化

  138.     DisplayList(0x80,text_1);     //显示第一行
  139.         DisplayList(0x90,text_2);     //显示第二行
  140.         DisplayList(0x88,text_3);     //显示第三行
  141.         DisplayList(0x98,text_4);     //显示第四行
  142.         while(1);
  143. }
复制代码
回复

使用道具 举报

ID:541949 发表于 2019-5-19 11:23 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:478073 发表于 2019-5-19 11:26 | 显示全部楼层
输出乱码多数不是这个问题,多数是在输英文与数字时间距没处理好,汉字是16*16,输英文与数字是8*16,而12864没有做8*16的函数库,所以要自己做,网上有别人做好的库可拿来用。另外仿真与实物也完全不同,仿真有左右屏CS1 & CS2,实物少用。
回复

使用道具 举报

ID:542087 发表于 2019-5-19 15:09 | 显示全部楼层
先在网上找找有没有现成的参考代码把,从0开始很麻烦,也没有必要
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表