[STC单片机] test

[复制链接]
 楼主| 刺客_阿瑞 发表于 2017-1-6 13:58 | 显示全部楼层 |阅读模式
  1. #include <string.h>
  2. #include "common.h"
  3. #include "LCD1602.h"
  4. void main(void)
  5. {
  6.         UB8 i ;
  7.         UB8 author[] = "Author:YangRui" ;
  8.         Lcd1602Init();
  9.         for(i=0 ; i<sizeof(author)-1 ; i++)
  10.         {
  11.         Lcd1602AddressWriteByte(LCD1602_ROW0,i,author[i]);
  12.         }
  13.         Lcd1602AddressWriteString(LCD1602_ROW1,0,"QQ:279729201") ;
  14.         while(1);
  15. }

  1. /***************************************************************************
  2. 模    块:LCD1602.c  

  3. 说    明:LCD1602驱动程序

  4. 版    本:Version2.0.0                2016/01/06 12:08(OK)

  5. 编译环境:Keil 8051 C complier V9.01

  6. 主控芯片:STC12C5A60S2                  @11.0592MHZ

  7. 作    者:杨瑞

  8. 联系方式:【QQ】279729201

  9.                  【Email】279729201[url=home.php?mod=space&uid=752448]@qq.com[/url]            
  10.                           yangrui90s@163.com
  11.                  

  12. 修改记录:
  13. =================
  14.         2017/01/6 12:08
  15.         记录:
  16.                 1.增加中文注释。
  17.                 2.修改函数名称模式,首写字母改为大写,例如lcd1602ReadStatus修改为Lcd1602ReadStatus。
  18.                 3.修改延时函数,将Delay1msForLcd1602函数修改为Delay80usForLcd1602函数。注意,这两个函数都是
  19.                   由STC-ISP生成,Delay80usForLcd1602函数由STC-ISP V6.85Q的“软件延时计算器”针对STC-Y3指令集
  20.                   @11.0592MHZ自动生成。经过测试,延时59us可能会出现只书写部分内容的情况,延时60us正好可以。
  21.                   为了安全,也可以将此延时修改的更长。
  22. =================

  23. =================
  24.         2014/04/31 20:09
  25.         记录:
  26.                 1.解决大工程中,因未安装LCD1602而导致的工程卡死在函数
  27.                 lcd1602CheckBusy()的问题,将
  28.                 do{
  29.                                 ;
  30.                 }while( (lcd1602ReadStatus()) & 0x80));
  31.                 修改为
  32.                 do{
  33.                         i++;
  34.                 }while( ((lcd1602ReadStatus()) & 0x80)  && (i<10));
  35.                 因为在未安装LCD1602时,通过"读状态"函数lcd1602ReadStatus()读回来的永远是0xff,
  36.                 如果采用第一种算法,会导致程序"卡死"。

  37. =================

  38. =================
  39.         2014/02/24 23:44
  40.         记录:
  41.                 1.增加函数lcd1602AddressWriteString(...)
  42. =================

  43. =================
  44.         2014/02/24 15:00
  45.         记录:
  46.                 1.增加函数delay1msForLcd1602()
  47.                   STC12C5A60S2单片机操作速度快比传统8051快,某些操作延时必须足够。
  48. =================


  49. ***************************************************************************/
  50. #include <intrins.h>
  51. #include <string.h>
  52. #include "lcd1602.h"

  53. /*外部接口函数在lcd1602.h中声明*/

  54. /*****************内部函数******************/
  55. static void Delay80usForLcd1602(void) ;
  56. static UB8 Lcd1602ReadStatus(void) ;
  57. static void Lcd1602CheckBusy(void) ;

  58. /**********************************************/


  59. /******************************************************************
  60. - 函数名称:Delay80usForLcd1602
  61. - 功能描述:延时函数
  62. - 隶属模块:LCD1602模块
  63. - 函数属性:内部函数
  64. - 参数说明:无
  65. - 返回说明:无
  66. - 注:此函数由STC-ISP V6.85Q的“软件延时计算器”针对STC-Y3指令集 @11.0592MHZ自动生成,若
  67.       指令集或晶振不同,需稍作修改。
  68. ******************************************************************/
  69. static void Delay80usForLcd1602(void)
  70. {
  71.         unsigned char i, j;

  72.         _nop_();
  73.         _nop_();
  74.         _nop_();
  75.         i = 1;
  76.         j = 216;
  77.         do
  78.         {
  79.                 while (--j);
  80.         } while (--i);
  81. }

  82. /******************************************************************
  83. - 函数名称:Lcd1602ReadStatus
  84. - 功能描述:读取LCD1602状态值
  85. - 隶属模块:LCD1602模块
  86. - 函数属性:内部函数
  87. - 参数说明:无
  88. - 返回说明:LCD1602的状态值
  89. ******************************************************************/
  90. static UB8 Lcd1602ReadStatus(void)
  91. {
  92.         UB8 statusCode ;

  93.         lcd1602_en_bit = LCD1602_DISABLE ;                        /*禁止操作LCD1602*/
  94.         lcd1602_rs_bit = LCD1602_COMMAND_OPERATION ;/*命令模式*/
  95.         lcd1602_rw_bit = LCD1602_READ_OPERATION ;        /*读操作*/

  96.         LCD1602_DATA_PORT = 0xff ;
  97.         Delay80usForLcd1602() ;
  98.         lcd1602_en_bit = LCD1602_ENABLE ;                        /*允许操作LCD1602*/
  99.         Delay80usForLcd1602() ;
  100.         statusCode = LCD1602_DATA_PORT ;                        /*读取状态值*/
  101.         lcd1602_en_bit = LCD1602_DISABLE ;                        /*禁止操作LCD1602*/

  102.         return statusCode ;
  103. }

  104. /******************************************************************
  105. - 函数名称:Lcd1602CheckBusy
  106. - 功能描述:判断LCD1602是否忙碌:若忙碌则等待;若空闲则执行任务
  107. - 隶属模块:LCD1602模块
  108. - 函数属性:内部函数
  109. - 参数说明:无
  110. - 返回说明:无
  111. - 注:当LCD1602_DATA_PORT[7]等于1,表示LCD1602忙碌,则需要等待一会儿
  112.       当LCD1602_DATA_PORT[7]等于0,表示LCD1602空闲,则需要继续执行后面的任务
  113.                                   LCD1602_DATA_PORT[7]==0,lcd1602 is free.
  114. - 补充:这里的“10”是经过测试的,测试中,利用串口打印
  115.                         的i的值为1,这里写10已经足够大了。
  116. ******************************************************************/
  117. static void Lcd1602CheckBusy(void)
  118. {
  119.         UW16 i=0;
  120.        
  121.         do{
  122.                 i++;
  123.         }while( ((Lcd1602ReadStatus()) & 0x80) && (i<10));
  124. }

  125. /******************************************************************
  126. - 函数名称:Lcd1602WriteCommand
  127. - 功能描述:LCD1602写命令
  128. - 隶属模块:LCD1602模块
  129. - 函数属性:外部函数,供用户调用
  130. - 参数说明:需要发送给LCD1602的指令值
  131. - 返回说明:无
  132. ******************************************************************/
  133. void Lcd1602WriteCommand(UB8 commandCode)
  134. {
  135.         Lcd1602CheckBusy();
  136.        
  137.         lcd1602_en_bit = LCD1602_DISABLE ;                        /*禁止操作LCD1602*/
  138.         lcd1602_rs_bit = LCD1602_COMMAND_OPERATION ;/*命令模式*/
  139.         lcd1602_rw_bit = LCD1602_WRITE_OPERATION ;        /*写操作*/

  140.         LCD1602_DATA_PORT = commandCode ;                        /*发送指令值*/
  141.         Delay80usForLcd1602();
  142.         lcd1602_en_bit = LCD1602_ENABLE ;                        /*允许操作LCD1602*/
  143.         Delay80usForLcd1602();

  144.         lcd1602_en_bit = LCD1602_DISABLE ;                        /*禁止操作LCD1602*/
  145. }

  146. /******************************************************************
  147. - 函数名称:Lcd1602WriteData
  148. - 功能描述:LCD1602写数据
  149. - 隶属模块:LCD1602模块
  150. - 函数属性:外部函数,供用户调用
  151. - 参数说明:需要发送给LCD1602的数据
  152. - 返回说明:无
  153. ******************************************************************/
  154. void Lcd1602WriteData(UB8 dataCode)
  155. {       
  156.         Lcd1602CheckBusy() ;
  157.        
  158.         lcd1602_en_bit = LCD1602_DISABLE ;                        /*禁止操作LCD1602*/
  159.         lcd1602_rs_bit = LCD1602_DATA_OPERATION ;        /*数据模式*/
  160.         lcd1602_rw_bit = LCD1602_WRITE_OPERATION ;        /*写操作*/

  161.         LCD1602_DATA_PORT = dataCode;                                /*发送数据*/
  162.         Delay80usForLcd1602();
  163.         lcd1602_en_bit = LCD1602_ENABLE ;                        /*允许操作LCD1602*/
  164.         Delay80usForLcd1602();

  165.         lcd1602_en_bit = LCD1602_DISABLE ;                         /*禁止操作LCD1602*/  
  166. }

  167. /******************************************************************
  168. - 函数名称:Lcd1602CleanAll
  169. - 功能描述:清除屏幕显示
  170. - 隶属模块:LCD1602模块
  171. - 函数属性:外部函数,供用户调用
  172. - 参数说明:无
  173. - 返回说明:无
  174. - 注:清除屏幕显示,光标归位(左上角),地址计数器AC设为0
  175. ******************************************************************/
  176. void Lcd1602CleanAll(void)
  177. {
  178.         Lcd1602WriteCommand(LCD1602_CLEAN_ALL_DISPALY);
  179. }

  180. /******************************************************************
  181. - 函数名称:Lcd1602CursorHoming
  182. - 功能描述:光标归位
  183. - 隶属模块:LCD1602模块
  184. - 函数属性:外部函数,供用户调用
  185. - 参数说明:无
  186. - 返回说明:无
  187. - 注:光标归为,当屏幕移动显示时,lcd1602显示所有数据后,
  188.            调用此函数,屏幕显示的所有东西都会归位。光标在第一
  189.            个位置(0x80)。
  190. ******************************************************************/
  191. void Lcd1602CursorHoming(void)
  192. {
  193.         Lcd1602WriteCommand(LCD1602_CURSOR_RETURN_TO_ORIGIN);
  194. }

  195. /******************************************************************
  196. - 函数名称:Lcd1602Init
  197. - 功能描述:LCD1602初始化
  198. - 隶属模块:LCD1602模块
  199. - 函数属性:外部函数,供用户调用
  200. - 参数说明:无
  201. - 返回说明:无
  202. - 注:设置(1)显示模式
  203.            (2)液晶显示允许或禁止、光标显示允许或禁止、光标闪烁允许或禁止
  204.                    (3)地址指针加一或减一、光标指针加一或减一、屏幕左移或右移
  205.                   
  206.                    可通过修改LCD1602.H中的LCD1602_DEFAULT_DISPALY_MODE、LCD1602_DEFAULT_DISPLAY_AND_CURSOR_MODE、
  207.                    LCD1602_DEFAULT_POINT_AND_POINT_ADDRESS_MODE达到不同的显示效果。
  208. ******************************************************************/
  209. void Lcd1602Init(void)
  210. {
  211.         lcd1602_en_bit = LCD1602_DISABLE ;
  212.        
  213.         Lcd1602CleanAll();
  214.         Lcd1602WriteCommand(LCD1602_DEFAULT_DISPALY_MODE);
  215.         Lcd1602WriteCommand(LCD1602_DEFAULT_DISPLAY_AND_CURSOR_MODE);
  216.         Lcd1602WriteCommand(LCD1602_DEFAULT_POINT_AND_POINT_ADDRESS_MODE);

  217.         /*可忽略,在Lcd1602CleanAll()中隐含了该功能*/
  218.         //Lcd1602CursorHoming();
  219.        
  220.         lcd1602_en_bit = LCD1602_DISABLE ;
  221. }

  222. /******************************************************************
  223. - 函数名称:Lcd1602AddressWriteByte
  224. - 功能描述:在LCD1602的row行column列写入数据dataCode
  225. - 隶属模块:LCD1602模块
  226. - 函数属性:外部函数,供用户调用
  227. - 参数说明:row-->行地址,有效值为LCD1602_ROW0或LCD1602_ROW1
  228.                          column-->列地址,有效值为0~39之间的整数
  229.                          dataCode-->需要写入的数据。
  230. - 返回说明:0(成功)或者-1(失败)
  231. - 注:行地址和列地址都是从0开始的。
  232.       
  233.            想在LCD1602的第0行第2列显示阿里伯数字5,调用方式为
  234.            Lcd1602AddressWriteByte(LCD1602_ROW0,2,‘5’);

  235.            在DEBUG模式下,会对入参进行有效性判断,协助分析。调试后期可通过
  236.        屏蔽common.h中的"#define DEBUG  1"减小目标文件的大小。   
  237. ******************************************************************/
  238. SB8 Lcd1602AddressWriteByte(UB8 row,UB8 column,UB8 dataCode)
  239. {
  240.         #ifdef   DEBUG
  241.                 if(column< LCD1602_MIN_COLUMN|| column > LCD1602_MAX_COLUMN|| \
  242.                    ( (row != LCD1602_ROW0) &&(row != LCD1602_ROW1)))
  243.                 {
  244.                         return LCD1602_ROW_OR_COLUMN_OVERFLOW ;
  245.                 }
  246.         #endif /*DEBUG*/
  247.        
  248.         if(row == LCD1602_ROW0)
  249.         {
  250.                 Lcd1602WriteCommand(LCD1602_ROW0_ADDRESS_START+column) ;
  251.         }
  252.         else if(row == LCD1602_ROW1)
  253.         {
  254.                 Lcd1602WriteCommand(LCD1602_ROW1_ADDRESS_START+column) ;
  255.                
  256.         }
  257.        
  258.         Lcd1602WriteData(dataCode);

  259.         return 0;
  260. }

  261. /******************************************************************
  262. - 函数名称:Lcd1602AddressWriteString
  263. - 功能描述:从LCD1602的row行column列开始写入字符串stringCode
  264. - 隶属模块:LCD1602模块
  265. - 函数属性:外部函数,供用户调用
  266. - 参数说明:row-->行地址,有效值为LCD1602_ROW0或LCD1602_ROW1
  267.                          column-->列地址,有效值为0~39之间的整数
  268.                          stringCode-->字符串
  269. - 返回说明:0(成功)或者-1(失败)
  270. - 注:行地址和列地址都是从0开始的。

  271.            想在LCD1602的第0行第2列显示"test",调用方式为
  272.            Lcd1602AddressWriteString(LCD1602_ROW0,2,"test");
  273.           
  274.            这里使用的是strlen,而不是sizeof。

  275.            在DEBUG模式下,会对入参进行有效性判断,协助分析。调试后期可通过
  276.        屏蔽common.h中的"#define DEBUG  1"减小目标文件的大小。
  277. ******************************************************************/
  278. SB8 Lcd1602AddressWriteString(UB8 row,UB8 column,UB8 *stringCode)
  279. {
  280.         UB8 length = strlen(stringCode) ;
  281.        
  282.         #ifdef DEBUG
  283.                 if(column< LCD1602_MIN_COLUMN|| (column+strlen(stringCode)-1) > LCD1602_MAX_COLUMN|| \
  284.                    ( (row != LCD1602_ROW0) &&(row != LCD1602_ROW1)))
  285.                 {
  286.                         return LCD1602_ROW_OR_COLUMN_OVERFLOW ;
  287.                 }
  288.         #endif        /*DEBUG*/

  289.         if(row == LCD1602_ROW0)
  290.         {
  291.                 Lcd1602WriteCommand(LCD1602_ROW0_ADDRESS_START+column) ;
  292.         }
  293.         else if(row == LCD1602_ROW1)
  294.         {
  295.                 Lcd1602WriteCommand(LCD1602_ROW1_ADDRESS_START+column) ;
  296.                
  297.         }
  298.         while(length--)
  299.         {
  300.                 Lcd1602WriteData(*stringCode);
  301.                 stringCode++;
  302.         }

  303.         return 0;
  304. }


阿飞507 发表于 2017-1-6 14:12 | 显示全部楼层
什么情况?
KNK550489325 发表于 2017-1-6 14:31 | 显示全部楼层

估计测试完他会删掉的
wsnsyy 发表于 2017-1-6 14:49 | 显示全部楼层
test what?
 楼主| 刺客_阿瑞 发表于 2017-1-6 15:24 | 显示全部楼层
KNK550489325 发表于 2017-1-6 14:31
估计测试完他会删掉的

我都崩溃了,同样的代码,一会儿可以粘贴,一会儿不能粘贴,我都服了,都不知道为啥、
KNK550489325 发表于 2017-1-6 15:30 | 显示全部楼层
刺客_阿瑞 发表于 2017-1-6 15:24
我都崩溃了,同样的代码,一会儿可以粘贴,一会儿不能粘贴,我都服了,都不知道为啥、 ...

你慢慢研究吧 其实你可以全选之后选择取消链接 肯定是里面有什么链接导致 提示有URL链接
icecut 发表于 2017-1-6 16:42 | 显示全部楼层
里面肯定有链接,我都看到了....有 qq,有其他链接
 楼主| 刺客_阿瑞 发表于 2017-1-6 19:50 | 显示全部楼层
icecut 发表于 2017-1-6 16:42
里面肯定有链接,我都看到了....有 qq,有其他链接

好吧,哈哈,又来了一个版主啊,谢谢,知道了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

26

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

7

主题

26

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部