C51单片机,128*64串口LCD驱动

  1. CA12864K 串口C51演示程序
  2. //                    CA12864K 测试程序(串口) 
  3. //***************************************************************************
  4. //连线表: CPU=89C52  SystemClock=12Mhz                                      *
  5. //CS=P3.0            SCLK=P3.1          SID=P3.2       Reset=RC in Board    *
  6. //***************************************************************************
  7. #include <reg52.h>
  8. #include <stdlib.h>
  9. #include <intrins.h>
  10. #include <stdio.h>
  11. sbit CS =P3^0;
  12. sbit SCK=P3^1;
  13. sbit SID=P3^2;
  14. sbit Key=P3^4;
  15. unsigned char code AC_TABLE[]={
  16. 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,      //第一行汉字位置
  17. 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,      //第二行汉字位置
  18. 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,      //第三行汉字位置
  19. 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,      //第四行汉字位置
  20. };
  21. unsigned char code str2[]="欢迎光临sunson!!";
  22. unsigned char code str1[]="黄河远上白云间,一片孤城万仞山。羌笛何须怨杨柳,春风不度玉门关。";
  23. unsigned char code bmp1[];
  24. //串口发送一个字节
  25. void SendByte(unsigned char Dbyte)
  26. {
  27.      unsigned char i;
  28.      for(i=0;i<8;i++)
  29.      {
  30.            SCK = 0;
  31.            Dbyte=Dbyte<<1;      //左移一位
  32.            SID = CY;            //移出的位给SID
  33.            SCK = 1;
  34.            SCK = 0;
  35.      }
  36. }
  37. //串口接收一个字节
  38. //仅在读取数据的时候用到
  39. //而读出的数据是一次只能读出4bit的
  40. unsigned char ReceiveByte(void)
  41. {
  42.      unsigned char i,temp1,temp2;
  43.      temp1=temp2=0;
  44.      for(i=0;i<8;i++)
  45.      {
  46.            temp1=temp1<<1;
  47.            SCK = 0;
  48.            SCK = 1;            
  49.            SCK = 0;
  50.            if(SID) temp1++;
  51.      }
  52.      for(i=0;i<8;i++)
  53.      {
  54.            temp2=temp2<<1;
  55.            SCK = 0;
  56.            SCK = 1;
  57.            SCK = 0;
  58.            if(SID) temp2++;
  59.      }
  60.      return ((0xf0&temp1)+(0x0f&temp2));
  61. }
  62. void CheckBusy( void )
  63. {
  64.      do   SendByte(0xfc);      //11111,RW(1),RS(0),0
  65.      while(0x80&ReceiveByte());      //BF(.7)=1 Busy
  66. }
  67. void WriteCommand( unsigned char Cbyte )
  68. {
  69.      CS = 1;
  70.      CheckBusy();
  71.      SendByte(0xf8);            //11111,RW(0),RS(0),0
  72.      SendByte(0xf0&Cbyte);      //高四位
  73.      SendByte(0xf0&Cbyte<<4);//低四位(先执行<<)
  74.      CS = 0;
  75. }
  76. void WriteData( unsigned char Dbyte )
  77. {
  78.      CS = 1;
  79.      CheckBusy();
  80.      SendByte(0xfa);            //11111,RW(0),RS(1),0
  81.      SendByte(0xf0&Dbyte);      //高四位
  82.      SendByte(0xf0&Dbyte<<4);//低四位(先执行<<)
  83.      CS = 0;
  84. }
  85. unsigned char ReadData( void )
  86. {
  87.      CheckBusy();
  88.      SendByte(0xfe);            //11111,RW(1),RS(1),0
  89.      return ReceiveByte();
  90. }
  91. void Delay(unsigned int MS)
  92. {
  93.      unsigned char us,usn;
  94.      while(MS!=0)            //for 12M
  95.            { usn = 2;
  96.                  while(usn!=0)
  97.                        {
  98.                              us=0xf5;
  99.                              while (us!=0){us--;};
  100.                              usn--;
  101.                        }
  102.                  MS--;
  103.            }
  104. }
  105. //松山电子测试架专用延时函数
  106. void DelayKey(unsigned int Second , unsigned int MS100)
  107. {                              //输入精确到0.1S,是用","
  108.      unsigned int i;
  109.      for(i=0;i<Second*100+MS100*10;i++)
  110.      {
  111.            if(Key==0)
  112.            {
  113.                  Delay(20);
  114.                  while(Key==0) {Delay(20);}
  115.                  break;
  116.            }
  117.            else Delay(10);
  118.      }
  119. }
  120. void LcmInit( void )
  121. {
  122.      WriteCommand(0x30);      //8BitMCU,基本指令集合
  123.      WriteCommand(0x03);      //AC归0,不改变DDRAM内容
  124.      WriteCommand(0x0C);      //显示ON,游标OFF,游标位反白OFF
  125.      WriteCommand(0x01);      //清屏,AC归0
  126.      WriteCommand(0x06);      //写入时,游标右移动
  127. }
  128. //文本区清RAM函数
  129. void LcmClearTXT( void )
  130. {
  131.      unsigned char i;
  132.      WriteCommand(0x30);      //8BitMCU,基本指令集合
  133.      WriteCommand(0x80);      //AC归起始位
  134.      for(i=0;i<64;i++)
  135.         WriteData(0x20);
  136. }
  137. //图形区和文本区显示在两个不同的RAM区
  138. //图形区清RAM函数
  139. void LcmClearBMP( void )
  140. {
  141.      unsigned char i,j;
  142.      WriteCommand(0x34);      //8Bit扩充指令集,即使是36H也要写两次
  143.      WriteCommand(0x36);      //绘图ON,基本指令集里面36H不能开绘图
  144.      for(i=0;i<32;i++)            //12864实际为256x32
  145.      {
  146.            WriteCommand(0x80|i);      //行位置
  147.            WriteCommand(0x80);      //列位置
  148.            for(j=0;j<32;j++)            //256/8=32 byte
  149.                 WriteData(0);
  150.      }
  151. }
  152. void PutStr(unsigned char row,unsigned char col,unsigned char *puts)
  153. {
  154.      WriteCommand(0x30);      //8BitMCU,基本指令集合
  155.      WriteCommand(AC_TABLE[8*row+col]);      //起始位置
  156.      while(*puts != '/0')      //判断字符串是否显示完毕
  157.      {
  158.            if(col==8)            //判断换行
  159.            {            //若不判断,则自动从第一行到第三行
  160.                  col=0;
  161.                  row++;
  162.            }
  163.            if(row==4) row=0;      //一屏显示完,回到屏左上角
  164.            WriteCommand(AC_TABLE[8*row+col]);
  165.            WriteData(*puts);      //一个汉字要写两次
  166.            puts++;
  167.            WriteData(*puts);
  168.            puts++;
  169.            col++;
  170.      }
  171. }
  172. void PutBMP(unsigned char *puts)
  173. {
  174.      unsigned int x=0;
  175.      unsigned char i,j;
  176.      WriteCommand(0x34);      //8Bit扩充指令集,即使是36H也要写两次
  177.      WriteCommand(0x36);      //绘图ON,基本指令集里面36H不能开绘图
  178.      for(i=0;i<32;i++)            //12864实际为256x32
  179.      {
  180.            WriteCommand(0x80|i);      //行位置
  181.            WriteCommand(0x80);      //列位置
  182.            for(j=0;j<32;j++)      //256/8=32 byte
  183.            {            //列位置每行自动增加
  184.                  WriteData(puts[x]);
  185.                  x++;
  186.            }
  187.      }
  188. }
  189. //松山电子测试用点阵显示
  190. void DisplayDots(unsigned char DotByte)
  191. {
  192.      unsigned char i,j;
  193.      WriteCommand(0x34);      //8Bit扩充指令集,即使是36H也要写两次
  194.      WriteCommand(0x36);      //绘图ON,基本指令集里面36H不能开绘图
  195.      for(i=0;i<32;i++)            //12864实际为256x32
  196.      {
  197.            WriteCommand(0x80|i);      //行位置
  198.            WriteCommand(0x80);      //列位置
  199.            for(j=0;j<32;j++)      //256/8=32 byte
  200.            {            //列位置每行自动增加
  201.                  WriteData(DotByte);                  
  202.            }
  203.            DotByte=~DotByte;
  204.      }
  205. }
  206. void main( void )
  207. {
  208.      Delay(100);      //等待复位
  209.      LcmInit();
  210.      LcmClearTXT();
  211.      LcmClearBMP();
  212.      while(1)
  213.      {
  214.            LcmClearTXT();
  215.            PutBMP(bmp1);
  216.            DelayKey(1,5);
  217.            
  218.            DisplayDots(0x55);
  219.            DelayKey(1,5);
  220.            
  221.            LcmClearBMP();
  222.            PutStr(0,0,str1);
  223.            DelayKey(1,5);
  224.                        
  225.            LcmClearTXT();
  226.            DisplayDots(0xaa);
  227.            DelayKey(1,5);
  228.      }
  229. }
  230. unsigned char code bmp1[]={
  231. //********************************************************//
  232. //***** 转换的文件:E:/!Program/!BmpSample/25632.bmp
  233. //***** 源图形宽度 * 高度:256 * 32
  234. //***** 调整后宽度 * 高度:256 * 32
  235. //***** 字模格式:横向取模,冗余模式,字节正序,正色取模,
  236. //***** 点阵转换时间:2005/03/ 2   16:4:32
  237. //***** 位图点阵占用1024字节
  238. //********************************************************//
  239. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  240. 0x80,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x01,
  241. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  242. 0x80,0x00,0x3F,0xC0,0x00,0x07,0x07,0x00,0x04,0x01,0x00,0x00,0x38,0x60,0x00,0x01,
  243. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  244. 0x80,0x00,0x78,0xE0,0x00,0x3F,0x83,0x80,0x06,0x03,0x80,0x00,0x1C,0x70,0x00,0x01,
  245. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  246. 0x80,0x02,0x38,0x70,0x00,0xFF,0x07,0x80,0x06,0x39,0x80,0x00,0x1F,0x70,0x00,0x01,
  247. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  248. 0x80,0x02,0x1C,0x30,0x00,0x7C,0x0E,0x00,0x06,0x19,0xC0,0x00,0x1F,0x80,0x00,0x01,
  249. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  250. 0x80,0x02,0x1C,0x30,0x00,0x3E,0x1C,0x00,0x06,0x1F,0xC0,0x00,0x7F,0x00,0x00,0x01,
  251. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  252. 0x80,0x03,0x3E,0x30,0x00,0x62,0x1A,0x00,0x0F,0x79,0x00,0x03,0xFE,0x00,0x00,0x01,
  253. 0x80,0x00,0x00,0x60,0x0F,0x00,0x3F,0x00,0x00,0x00,0x3C,0x00,0xC0,0x00,0x00,0x01,
  254. 0x80,0x07,0x76,0x18,0x00,0xC3,0xC1,0x00,0x1F,0xFB,0x00,0x03,0xFE,0x00,0x00,0x01,
  255. 0x80,0x00,0x01,0xE0,0x3F,0xC0,0xF1,0xC0,0x00,0x00,0xF0,0x01,0xC0,0x00,0x00,0x01,
  256. 0x80,0x07,0x6E,0x18,0x00,0xCF,0xC1,0x80,0x7E,0x3F,0x80,0x01,0xE2,0x00,0x00,0x01,
  257. 0x80,0x00,0x07,0xE0,0x7F,0xE0,0xE0,0xE0,0x00,0x03,0xC0,0x03,0xC0,0x00,0x00,0x01,
  258. 0x80,0x07,0x7F,0x98,0x00,0xFE,0x83,0x81,0xFC,0x1E,0xC0,0x00,0x83,0x00,0x00,0x01,
  259. 0x80,0x00,0x0F,0xE0,0x63,0xE1,0xE0,0xE0,0x00,0x07,0x00,0x03,0xC0,0x00,0x00,0x01,
  260. 0x80,0x06,0xFF,0xD8,0x01,0xFA,0x87,0x00,0xFD,0xF8,0xC0,0x01,0x73,0x00,0x00,0x01,
  261. 0x80,0x00,0x01,0xE0,0xC1,0xE1,0xE0,0xE0,0x00,0x0F,0x00,0x07,0xC0,0x00,0x00,0x01,
  262. 0x80,0x0F,0xD9,0xD8,0x03,0xE3,0x0E,0x80,0xFE,0x7E,0xC0,0x03,0xF9,0x80,0x00,0x01,
  263. 0x80,0x00,0x01,0xE0,0x01,0xE1,0xF0,0xE0,0x00,0x1E,0x00,0x0B,0xC0,0x00,0x00,0x01,
  264. 0x80,0x0D,0xB8,0x18,0x1F,0xC3,0x08,0xC0,0x0E,0x6D,0x80,0x03,0xF1,0x80,0x00,0x01,
  265. 0x80,0x00,0x01,0xE0,0x01,0xE0,0xFD,0xC7,0xEF,0x9E,0x00,0x13,0xC0,0x00,0x00,0x01,
  266. 0x80,0x0D,0xFE,0x18,0x0F,0xC2,0x10,0xE0,0x1C,0x3F,0x00,0x03,0xE0,0xC0,0x00,0x01,
  267. 0x80,0x00,0x01,0xE0,0x01,0xC0,0xFF,0x83,0xC6,0x1F,0xE0,0x13,0xC0,0x00,0x00,0x01,
  268. 0x80,0x0D,0xCE,0x18,0x06,0xC2,0x01,0xC0,0x38,0x3E,0x00,0x00,0xE8,0xC0,0x00,0x01,
  269. 0x80,0x00,0x01,0xE0,0x01,0x80,0x3F,0x81,0xE4,0x3C,0x78,0x23,0xC0,0x00,0x00,0x01,
  270. 0x80,0x0C,0x4C,0x18,0x00,0xC2,0x03,0x80,0x78,0x1F,0xF0,0x00,0xFC,0x60,0x00,0x01,
  271. 0x80,0x00,0x01,0xE0,0x03,0x80,0x3F,0xC1,0xE8,0x3C,0x78,0x43,0xC0,0x00,0x00,0x01,
  272. 0x80,0x0C,0x5E,0x18,0x00,0xC2,0x07,0x00,0x68,0x3F,0xF8,0x03,0xFC,0x22,0x00,0x01,
  273. 0x80,0x00,0x01,0xE0,0x03,0x00,0x6F,0xC0,0xF0,0x3C,0x3C,0x83,0xC0,0x00,0x00,0x01,
  274. 0x80,0x06,0x3F,0x38,0x01,0x82,0x0E,0x00,0x09,0xF8,0x00,0x03,0xC0,0x32,0x00,0x01,
  275. 0x80,0x00,0x01,0xE0,0x06,0x00,0xC3,0xE0,0x78,0x3C,0x3C,0xFF,0xF0,0x00,0x00,0x01,
  276. 0x80,0x07,0x10,0x38,0x00,0x82,0x1C,0x00,0x0B,0x99,0xC0,0x03,0x00,0x1A,0x00,0x01,
  277. 0x80,0x00,0x01,0xE0,0x0C,0x11,0xC3,0xE0,0x78,0x3C,0x3C,0xFF,0xF0,0x00,0x00,0x01,
  278. 0x80,0x03,0xFF,0xF0,0x00,0x02,0x38,0x00,0x08,0x30,0xE0,0x02,0x00,0x1E,0x00,0x01,
  279. 0x80,0x00,0x01,0xE0,0x08,0x11,0xC1,0xE0,0x7C,0x3C,0x3C,0xFF,0xF0,0x00,0x00,0x01,
  280. 0x80,0x01,0xEF,0xF0,0x00,0x00,0xE0,0x00,0x08,0xE0,0x60,0x00,0x00,0x0E,0x00,0x01,
  281. 0x80,0x00,0x01,0xE0,0x1F,0xF1,0xC1,0xE0,0xBC,0x1C,0x3C,0x03,0xC0,0x00,0x00,0x01,
  282. 0x80,0x00,0x03,0xE0,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x07,0x00,0x01,
  283. 0x80,0x00,0x01,0xE0,0x3F,0xE1,0xC1,0xC0,0x9E,0x1E,0x38,0x03,0xC0,0x00,0x00,0x01,
  284. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,
  285. 0x80,0x00,0x01,0xF0,0x7F,0xE0,0xE3,0x83,0x1F,0x0E,0x70,0x03,0xC0,0x00,0x00,0x01,
  286. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  287. 0x80,0x00,0x0F,0xFC,0xFF,0xE0,0x3F,0x07,0xDF,0x83,0xE0,0x03,0xC0,0x00,0x00,0x01,
  288. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  289. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  290. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  291. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  292. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  293. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  294. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  295. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  296. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  297. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  298. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  299. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  300. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
  301. 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x01,
  302. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  303. };
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值