找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2263|回复: 2
打印 上一主题 下一主题
收起左侧

lcd12864程序看不懂

[复制链接]
跳转到指定楼层
楼主
**************************************************************************************************/
这是12864的程序,这个程序比较看不懂,麻烦进行简单的显示嘛
原理图如下:




  1. #include"FYD12864.h"
  2. /*************************************************************************************************/
  3. void Delay_nus(unsigned int nTime)
  4. {
  5. unsigned long j;
  6. while(nTime--)
  7. {
  8.   j=12;
  9.   while(j--);
  10. }
  11. }
  12. /*************************************************************************************************/
  13. void LCD12864_Init(void) //初始化LCD12864
  14. {
  15.     //----------------------------------------------------------------------
  16.     Delay_nus(200);
  17.     SET_LCD12864_CS;
  18.     //----------------------------------------------------------------------
  19.     LCD2864Write_char(0, 0x01);    //清除屏幕显示,将DDRAM的地址计数器清零
  20.     Delay_nus(200);
  21.     LCD2864Write_char(0, 0x30);    //8BIT控制界面,基本指令集
  22.     Delay_nus(200);
  23.     LCD2864Write_char(0, 0X0C);
  24.     Delay_nus(200);
  25.     LCD2864Write_char(0, 0x01);  // 清除屏幕显示,将DDRAM的地址计数器清零
  26.     Delay_nus(200);
  27.     LCD2864Write_char(0, 0x06);  // DDRAM的地址计数器(AC)加1
  28.     Delay_nus(200);
  29.     //----------------------------------------------------------------------
  30.     LCD12864_Clear();
  31. }
  32. /*************************************************************************************************/
  33. /*************************************************************************************************/
  34. void Send_byte(unsigned char bbyte) //发送一个字节
  35. {
  36.     unsigned char i;
  37.     for(i = 0; i < 8; i++)
  38.     {
  39.         if((bbyte & 0x80) == 0x80) //取出最高位
  40.         {
  41.             SET_LCD12864_STD;
  42.         }
  43.         else
  44.         {
  45.             CLR_LCD12864_STD;
  46.         }
  47.         SET_LCD12864_SCLK;   
  48.         CLR_LCD12864_SCLK;
  49.         bbyte <<= 1;    //左移
  50.     }
  51. }
  52. void LCD2864Write_char(unsigned char Mode, unsigned char ddata) //写指令或数据
  53. {
  54.     unsigned char CMD_data, Hdata, Ldata;
  55.     if(Mode == 0X00)
  56.         CMD_data = 0xf8;   //写指令
  57.     else
  58.         CMD_data = 0xfa;    //写数据
  59.     Hdata = ddata & 0xf0;    //取高四位
  60.     Ldata = (ddata << 4) & 0xf0;  //取低四位
  61.     Send_byte(CMD_data);    //发送起始信号
  62.     Delay_nus(10);    //延时是必须的
  63.     Send_byte(Hdata);        //发送高四位
  64.     Delay_nus(10);    //延时是必须的
  65.     Send_byte(Ldata);     //发送低四位
  66.     Delay_nus(10);       //延时是必须的
  67. }
  68. /*************************************************************************************************/
  69. /*************************************************************************************************/
  70. void LCD12864_Clear(void)    //清屏函数
  71. {
  72.     // LCD2864Write_char(0,0x01);
  73.     LCD12864_lineclr(1);
  74.     LCD12864_lineclr(2);
  75.     LCD12864_lineclr(3);
  76.     LCD12864_lineclr(4);
  77. }
  78. void LCD12864_dispClear(void)    //清屏函数
  79. {
  80.     // LCD2864Write_char(0,0x01);
  81.     LCD12864_lineclr(2);
  82.     LCD12864_lineclr(3);
  83.     LCD12864_lineclr(4);
  84. }
  85. /*************************************************************************************************/
  86. void LCD12864_RE_0_1(void)       //文字模式,指令集由0变为1
  87. {
  88.     LCD2864Write_char(0, 0x30);
  89.     Delay_nus(50);
  90.     LCD2864Write_char(0, 0x34);
  91.     Delay_nus(50);
  92.     LCD2864Write_char(0, 0x36);
  93.     Delay_nus(50);
  94. }
  95. //此函数如果在文本模式,可以不要,如果同时显示图和显示字就要及时更换指令集,实现具体是什么操作
  96. void LCD12864_RE_1_0(void)     //图形模式,指令集由1变为0
  97. {
  98.     LCD2864Write_char(0, 0x36);
  99.     Delay_nus(50);
  100.     LCD2864Write_char(0, 0x32);
  101.     Delay_nus(50);
  102. }

  103. /*************************************************************************************************/
  104. void LCD12864_SetAddr(unsigned char VerticalAddr, unsigned char HorizontalAddr) //设定地址
  105. {
  106.     VerticalAddr   &= 0x1F;
  107.     HorizontalAddr &= 0xFF;
  108.     LCD2864Write_char(0,VerticalAddr   | 0x80);
  109.     Delay_nus(100);
  110.     LCD2864Write_char(0,HorizontalAddr | 0x80);
  111.     Delay_nus(100);
  112. }
  113. void LCD12864_Write_String(uint8_t hang, uint8_t lie, char *StringBuf)
  114. {
  115.     uint8_t address, i = 0;
  116.     switch(hang)
  117.     {
  118.   case 1:
  119.    address = 0x80;
  120.    break;
  121.   case 2:
  122.    address = 0x90;
  123.    break;
  124.   case 3:
  125.    address = 0x88;
  126.    break;
  127.   case 4:
  128.    address = 0x98;
  129.    break;
  130.   default:
  131.    address = 0x80;
  132.     }
  133.     LCD2864Write_char(0, address + lie);
  134.     for(i = 0; i < 16; i++)
  135.     {
  136.         LCD2864Write_char(1, *StringBuf);
  137.         StringBuf++;
  138.     }
  139. }
  140. void LCD12864_DispString2(uint8_t hang, uint8_t lie, char *StringBuf, uint8_t LEN)
  141. {
  142.     uint8_t address, i = 0;
  143.     switch(hang)
  144.     {
  145.   case 1:
  146.    address = 0x80;
  147.    break;
  148.   case 2:
  149.    address = 0x90;
  150.    break;
  151.   case 3:
  152.    address = 0x88;
  153.    break;
  154.   case 4:
  155.    address = 0x98;
  156.    break;
  157.   default:
  158.    address = 0x80;
  159.     }
  160.     LCD2864Write_char(0, address + lie);
  161.     for(i = 0; i < LEN; i++)
  162.     {
  163.         LCD2864Write_char(1, *StringBuf);
  164.         StringBuf++;
  165.     }
  166. }
  167. void LCD12864_DispString3(uint8_t hang, uint8_t lie, const char *StringBuf, uint8_t LEN)
  168. {
  169.     uint8_t address, i = 0;
  170.     switch(hang)
  171.     {
  172.   case 1:
  173.    address = 0x80;
  174.    break;
  175.   case 2:
  176.    address = 0x90;
  177.    break;
  178.   case 3:
  179.    address = 0x88;
  180.    break;
  181.   case 4:
  182.    address = 0x98;
  183.    break;
  184.   default:
  185.    address = 0x80;
  186.     }
  187.     LCD2864Write_char(0, address + lie);
  188.     for(i = 0; i < LEN; i++)
  189.     {
  190.         LCD2864Write_char(1, *StringBuf);
  191.         StringBuf++;
  192.     }
  193. }
  194. void LCD12864_DispString4(uint8_t hang, uint8_t lie, const char *StringBuf, uint8_t LEN)
  195. {
  196.     uint8_t address, i = 0;
  197.     switch(hang)
  198.     {
  199.   case 1:
  200.    address = 0x80;
  201.    break;
  202.   case 2:
  203.    address = 0x90;
  204.    break;
  205.   case 3:
  206.    address = 0x88;
  207.    break;
  208.   case 4:
  209.    address = 0x98;
  210.    break;
  211.   default:
  212.    address = 0x80;
  213.     }
  214.     LCD2864Write_char(0, address + lie);
  215.     for(i = 0; i < LEN; i++)
  216.     {
  217.         LCD2864Write_char(1, *StringBuf);
  218.         StringBuf++;
  219.     }
  220. }

  221. /*********************************************************************************************************
  222. ** 函数名称: Lcd_lineclr()
  223. ** 功能描述: 清除一行的显示
  224. ** 输 入: unsigned char row 要清除显示的行
  225. ** 输 出:
  226. ** 全局变量: 无
  227. ** 调用模块: 无
  228. ** 说明:
  229. ** 注意:
  230. *******************************************************************************************************/
  231. void LCD12864_lineclr(unsigned char row)
  232. {
  233.     unsigned char i;
  234.     switch(row)
  235.     {
  236.   case 1:
  237.   {
  238.    LCD2864Write_char(0, 0x80);
  239.    for(i = 0; i < 16; i++) LCD2864Write_char(1, ' ');
  240.    break;
  241.   }
  242.   case 2:
  243.   {
  244.    LCD2864Write_char(0, 0x90);
  245.    for(i = 0; i < 16; i++) LCD2864Write_char(1, ' ');
  246.    break;
  247.   }
  248.   case 3:
  249.   {
  250.    LCD2864Write_char(0, 0x88);
  251.    for(i = 0; i < 16; i++) LCD2864Write_char(1, ' ');
  252.    break;
  253.   }
  254.   case 4:
  255.   {
  256.    LCD2864Write_char(0, 0x98);
  257.    for(i = 0; i < 16; i++) LCD2864Write_char(1, ' ');
  258.    break;
  259.   }
  260.   default:
  261.    break;
  262.     }
  263. }

  264. /*************************************************************************************************
  265. **              END FILE
  266. **************************************************************************************************/




  267. **************************************************************************************************/

  268. #ifndef  __FYD12864_H__
  269. #define  __FYD12864_H__
  270. /*************************************************************/
  271. #include<stc15.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  272. #include<intrins.h>


  273. #define uint8_t unsigned char
  274. #define uint16_t  unsigned int  

  275. /*************************************************************************************************/
  276. #define LCD12864_RS_PIN             P20      //RS
  277. #define LCD12864_RW_PIN             P21   //RW
  278. #define LCD12864_RD_PIN             P22      //RD-EN
  279. /*************************************************************************************************/
  280. //PSB接GND----是串行模式
  281. //PSB接VCC----是并行模式
  282. #define    SET_LCD12864_CS      LCD12864_RS_PIN=1;
  283. #define    CLR_LCD12864_CS       LCD12864_RS_PIN=0;
  284. #define    SET_LCD12864_STD      LCD12864_RW_PIN=1;
  285. #define    CLR_LCD12864_STD      LCD12864_RW_PIN=0;
  286. #define    SET_LCD12864_SCLK     LCD12864_RD_PIN=1;
  287. #define    CLR_LCD12864_SCLK     LCD12864_RD_PIN=0;
  288. /*************************************************************************************************/
  289. //定义7920LCD控制命令    基本命令
  290. #define Lcd_Clear        0x01    //清除显示
  291. #define Lcd_Adress_Rest     0x02    //地址归0
  292. #define Lcd_Set_Entrance_Point   0x04  //设定光标移动方向并指定整体显示是否移动,offset 0x04/0x05/0x06/0x07
  293. #define Lcd_Display_Status    0x08 //显示状态(整体显示,整体不显示,光标闪烁,光标不闪烁),offset 0x08/0x0C/0x0D/0x0E/0x0F
  294. #define Lcd_Display_Shift    0x10    //光标或显示移位控制 offset 10H/14H/18H/1CH
  295. #define Lcd_Set_Function_Basic  0x30  //基本指令集
  296. #define Lcd_Set_Function_Extend  0x34  //扩展指令集
  297. #define Lcd_Set_Cgram    0x40 //设定CGRAM 地址 offset 0x00-0x3f
  298. #define Lcd_Set_Ddram    0x80    //设定DDRAM 地址
  299. //定义7920LCD控制命令    扩充命令
  300. #define Lcd_Wait_Mode    0x01    //待命模式 进入待命模式,执行其它命令都可终止待命模式
  301. #define Lcd_Enable_Iram    0x02 //sr=0 允许设定CGRAM 地址(基本指令)
  302. #define Lcd_Enable_Vectical_Roll 0x03 //sr=1 允许输入卷动地址
  303. #define Lcd_Iram_Address   0x40   //sr=1:offset 0x00~0x3
  304. #define Lcd_Back_White    0x04 //offset 0~3 反白选择
  305. #define Lcd_Enter_Sleep_Mode  0x08
  306. #define Lcd_Escape_Sleep_Mode  0x0c
  307. #define Lcd_Dram_On     0x36
  308. #define Lcd_Dram_Off    0x34
  309. #define Lcd_Set_Gdram    0x80 //offset 0x00~0x7f

  310. extern  void LCD12864_Init(void); //初始化LCD12864
  311. extern  void LCD2864Write_char(unsigned char Mode, unsigned char ddata); //写指令或数据
  312. extern  void LCD12864_Clear(void);    //清屏函数
  313. extern  void LCD12864_dispClear(void);   //清屏函数

  314. extern  void LCD12864_RE_0_1(void);      //文字模式,指令集由0变为1
  315. //此函数如果在文本模式,可以不要,如果同时显示图和显示字就要及时更换指令集,实现具体是什么操作
  316. extern  void LCD12864_RE_1_0(void);         //图形模式,指令集由1变为0
  317. extern  void LCD12864_SetAddr(unsigned char VerticalAddr, unsigned char HorizontalAddr);
  318. extern  void LCD12864_Write_String(uint8_t hang, uint8_t lie, char *StringBuf);
  319. extern  void LCD12864_DispString2(uint8_t hang, uint8_t lie,  char *StringBuf, uint8_t LEN);
  320. extern  void LCD12864_DispString3(uint8_t hang, uint8_t lie, const char *StringBuf, uint8_t LEN) ;
  321. extern  void Disp_img(const unsigned char  *img); //图形方式12864显示,字模221--横向取膜
  322. extern  void LCD12864_lineclr(unsigned char row);
  323. extern  void Lcd_linedisp(unsigned char *p, unsigned char row);
  324. extern  void LCDDisp_HEX(uint8_t hang, uint8_t lie, unsigned char  HEX_num[], unsigned char cnt);  //显示十六进制数
  325. #endif  
  326. /*****************************************************************/
  327. //**          END FILE
  328. /*****************************************************************/
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96682 发表于 2017-11-9 03:24 | 只看该作者
此帖仅作者可见

使用道具 举报

板凳
ID:111634 发表于 2017-11-9 12:38 | 只看该作者
此帖仅作者可见

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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