[示例代码] 数码管进行0~9999的计数实验

[复制链接]
 楼主| 家有两宝呀 发表于 2020-11-29 15:05 | 显示全部楼层 |阅读模式
程序声明KF8F系列单片机开发板演示程序  标 题: 数码管进行0~9999的计数实验
项 目 名: 03-Number_count_TEST
开发环境:ChipON IDE
作 者:上海芯旺微电子有限公司
功能简述: 数码管进行0~9999的计数,到达9999后,又从0开始。

xuanhuanzi 发表于 2021-1-14 13:06 | 显示全部楼层
IO直接驱动的了吗
heisexingqisi 发表于 2021-1-12 21:53 | 显示全部楼层
单片机编程吗
 楼主| 家有两宝呀 发表于 2020-12-26 22:21 | 显示全部楼层
这个确实要打好基础
 楼主| 家有两宝呀 发表于 2020-12-26 22:18 | 显示全部楼层
正圆椭圆 发表于 2020-12-3 23:58
这个示例能给个文件吗这样复制会有一些乱

因为文件会乱,所以才这样拷过来的。
两只袜子 发表于 2020-12-23 16:02 | 显示全部楼层
不错的应用。。。。学习了。。。
嵌入小菜菜 发表于 2020-12-23 09:49 | 显示全部楼层
这个代码不错,感谢楼主的分享。
嵌入小菜菜 发表于 2020-12-8 21:56 | 显示全部楼层
这个很棒,不错,不错的应用。学习了。

weifeng90 发表于 2020-12-6 21:12 | 显示全部楼层
看看,感谢楼主分享。
正圆椭圆 发表于 2020-12-3 23:58 | 显示全部楼层
这个示例能给个文件吗这样复制会有一些乱
x史可法 发表于 2020-12-3 23:49 | 显示全部楼层
楼主有心了 主要是这种理论型的要打好基础
凯复Kane 发表于 2020-12-2 23:35 | 显示全部楼层
很典型的实验呢拿来研究研究
过期的塔头 发表于 2020-11-29 15:19 | 显示全部楼层
等更
过期的塔头 发表于 2020-11-29 15:18 | 显示全部楼层
 楼主| 家有两宝呀 发表于 2020-11-29 15:15 | 显示全部楼层
本帖最后由 家有两宝呀 于 2020-11-29 15:17 编辑
  1. INT_END
  2. MOVR1 , PCH_TEMP
  3. MOVPCH, R1   
  4. SWAPR R1 , PSW_TEMP
  5. MOV PSW, R1
  6. IRET
  7. ;;;;;;;;;;;;;;中断部分结
  8. 束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  9.    
  10.    
  11.    
  12. ;;;;;;;;;;;;;;入口函数,主程
  13. 序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  14. MAIN
  15. CALL INIT_ALL     ;初始化寄存器
  16.     CALL INIT_RAM           ;初始化RAM
  17. LOOP   
  18. INC UNIT       ;个位数字的递增
  19. MOV R0 ,UNIT
  20. XOR R0 ,#0X0A
  21. JB PSW ,Z
  22. JMP C_DIS
  23. CLR UNIT
  24.    
  25. INC DECADE       ;十位数字的递增
  26. MOV R0 ,DECADE
  27. XOR R0 ,#0X0A
  28. JB PSW ,Z
  29. JMP C_DIS
  30. CLR DECADE
  31.    
  32. INC HUNDRED       ;百位数字的递增
  33. MOV R0 ,HUNDRED
  34. XOR R0 ,#0X0A
  35. JB PSW ,Z
  36. JMP C_DIS
  37. CLR HUNDRED
  38.    
  39. INC THOUSAND     ;千位数字的递增
  40. MOV R0 ,THOUSAND
  41. XOR R0 ,#0X0A
  42. JB PSW ,Z
  43. JMP C_DIS  
  44. CLR THOUSAND
  45.    
  46. C_DIS   
  47. MOV R0,#0x33
  48. MOV DIS_DEL,R0     ;DIS_DEL是用来延时数值的递增用的,数值越
  49. 大,那么递增的速度就越慢
  50. CALL LED_DISPLAY    ;数码管显示当前数值
  51. DECJZ DIS_DEL   
  52. JMP $‐2         ;调整地址以当前地址减2的位置
  53. JMP LOOP
  54.    
  55. CRET
  56. ;*************************************************************
  57. *****************
  58. ;* 函 数 名: INIT_ALL
  59. ;* 函数功能: 初始化函数,对各种寄存器的初始化
  60. ;* 入口参数: 无
  61. ;* 返    回: 无
  62. ;*************************************************************
  63. *****************
  64. INIT_ALL
  65. ;调入校准信息到控制寄存器
  66. CALL #0xFFF
  67. MOV OSCCAL0, R0    ;晶振校准0
  68. NOP
  69. NOP
  70. CALL #0xFFE
  71. MOV OSCCAL1, R0    ;晶振校准1
  72. NOP
  73. NOP
  74. ;选择工作频率
  75. MOV R0 ,#0x60   
  76. MOV OSCCTL, R0    ;设置为8M
  77. ;端口初始化
  78. ;***端口初始化********
  79. MOV R0 ,#0x08
  80. MOV TR0, R0      ;设置P0端口为输入
  81. MOV R0 ,#0x00
  82. MOV TR1, R0      ;设置P1端口为输出
  83. MOV R0 ,#0X00
  84. MOV TR2, R0      ;设置P2端口为输出
  85.    
  86. CLR P0
  87. CLR P1
  88. MOV R0 ,#0XF0       ;关闭数码管位选端
  89. MOV P2, R0      
  90. CRET
  91. ;*************************************************************
  92. *****************
  93. ;* 函 数 名: LED_DISPLAY
  94. ;* 函数功能: 数码管显示函数,由4个8位LED灯显示
  95. ;* 入口参数: THOUSAND 千位 ,HUNDRED 百位 ,SMQ_S 十位, UNIT 个位  ,
  96. 每个数的范围 0~f
  97. ;* 返    回: 无
  98. ;*************************************************************
  99. *****************
  100. LED_DISPLAY
  101. MOV R0 , #0XE0
  102. MOV P2 , R0        ;打开数码管的 个位
  103. MOV R2 , UNIT
  104. CALL DIG_DATA
  105. MOV P1 , R0
  106. CALL DELAY
  107. CLR P1     ;消隐
  108. MOV R0 ,#0XF0
  109. MOV P2 , R0
  110.    
  111. MOV R0 ,#0XD0
  112. MOV P2 , R0        ;打开数码管的 十位
  113. MOV R2 , DECADE
  114. CALL DIG_DATA
  115. MOV P1 , R0
  116. CALL DELAY
  117. CLR P1     ;消隐
  118. MOV R0 ,#0XF0
  119. MOV P2 , R0
  120. MOV R0 , #0XB0   
  121. MOV P2 , R0        ;打开数码管的 百位
  122. MOV R2 , HUNDRED
  123. CALL DIG_DATA
  124. MOV P1 , R0
  125. CALL DELAY
  126. CLR P1     ;消隐
  127. MOV R0 ,#0XF0
  128. MOV P2 , R0   
  129. MOV R0 , #0X70   
  130. MOV P2 , R0        ;打开数码管的 千位
  131. MOV R2 , THOUSAND
  132. CALL DIG_DATA
  133. MOV P1 , R0
  134. CALL DELAY
  135. CLR P1     ;消隐
  136. MOV R0 ,#0XF0
  137. MOV P2 , R0   
  138. CRET
  139. ;*************************************************************
  140. *****************
  141. ;* 函 数 名: DELAY
  142. ;* 函数功能: 延时函数,时间为1ms
  143. ;* 入口参数: 无
  144. ;* 返    回: 无
  145. ;*************************************************************
  146. *****************
  147. DELAY
  148. MOV R0,#0x12
  149. MOV DELAY_NUM1, R0
  150. LP0
  151. MOV R0,#0X12
  152. MOV DELAY_NUM2, R0
  153. LP1
  154. DECJZ DELAY_NUM2    ;DELAY_NUM2自减1,若为0,则跳过
  155. JMP LP1
  156. DECJZ DELAY_NUM1    ;DELAY_NUM1自减1,若为0,则跳过
  157. JMP LP0      
  158. CRET         ;子程序返回
  159. ;/************************************************************
  160. ******************
  161. ;* 函 数 名: init_RAM
  162. ;* 函数功能: 初始化RAM
  163. ;* 入口参数: 无
  164. ;* 返    回: 无
  165. ;*************************************************************
  166. *****************/
  167. INIT_RAM     
  168. CLR   R2       ;传递默认RAM值
  169. ; CLR RAM SET 0  BANK0
  170. CLR   PSW ,RP0   
  171. MOV   R0 ,#0X80   ;起始地址0x80
  172. MOV   R1 ,#0X20   ;操作个数
  173. CALL    INIT_RAM_0
  174. ; CLR RAM SET 0  BANK1
  175. SET   PSW ,RP0   
  176. MOV   R0 ,#0X80   ;起始地址0x80
  177. MOV   R1 ,#0X01   ;操作个数
  178. CALL    INIT_RAM_0
  179. ; 默认工作区域设定   BANK0
  180. CLR   PSW ,RP0
  181. ; 其他变量的数值操作
  182.    
  183.    
  184.    
  185. CRET
  186. ;;;;;;;;;;;;;;;;;;执行默认数值装载到RAM区
  187. INIT_RAM_0   
  188. ST [R0],R2
  189. INC R0
  190. DECJZ R1
  191. JMP  INIT_RAM_0
  192. CRET  
  193.    
  194. .end

 楼主| 家有两宝呀 发表于 2020-11-29 15:14 | 显示全部楼层
  1. DIG_DATA
  2.     ADD PCL,R2
  3. RRET R0 ,#0X3F    ;0
  4. RRET R0 ,#0X06    ;1
  5. RRET R0 ,#0X5B    ;2
  6. RRET R0 ,#0X4F    ;3
  7. RRET R0 ,#0X66    ;4
  8. RRET R0 ,#0X6D    ;5
  9. RRET R0 ,#0X7D    ;6
  10. RRET R0 ,#0X07    ;7
  11. RRET R0 ,#0X7F    ;8
  12. RRET R0 ,#0X6F    ;9
  13. RRET R0 ,#0X77    ;A
  14. RRET R0 ,#0X7C    ;B
  15. RRET R0 ,#0X39    ;C
  16. RRET R0 ,#0X5E    ;D
  17. RRET R0 ,#0X79    ;E
  18. RRET R0 ,#0X71    ;F
  19. RRET R0 ,#0X00    ;空
  20. ;;;;;;;;;;;;;;;中断部分;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  21. INTERRUPT
  22. ;保护现场作用,根据实际情况进行保存,中断内部和外部都使用的资源需要保
  23. 护,常规需要保护的内容有PSW PCH R0 R1
  24. SWAPR R1 ,PSW
  25. MOVPSW_TEMP, R1
  26. MOVR1 , PCH
  27. MOVPCH_TEMP, R1  
  28. ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
  29. ;中断处理
  30. ;...
  31. ;...
  32. ;...
  33. ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
  34. ;恢复现场作用
 楼主| 家有两宝呀 发表于 2020-11-29 15:14 | 显示全部楼层
  1. .INCLUDE "KF8F312.INC"
  2. ;;;;;;;;;;;;;;;;通用寄存器;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. DELAY_NUM1    .EQU 0X81    ;延时用的临时变量
  4. DELAY_NUM2    .EQU 0X82    ;延时用的临时变量
  5. PSW_TEMP    .EQU 0X85    ;PSW的临时保存变量
  6. PCH_TEMP    .EQU 0X86    ;PCH的临时保存变量
  7. UNIT     .EQU 0X88    ;数码管个位
  8. DECADE     .EQU 0X89    ;数码管十位
  9. HUNDRED     .EQU 0X8A    ;数码管百位
  10. THOUSAND    .EQU 0X8B    ;数码管千位
  11. DIS_DEL     .EQU 0X8C    ;DIS_DEL是用来延时数值的递增用的,
  12. 数值越大,那么递增的速度就越慢
  13. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  14. .ORG 0X0000
  15.    NOP
  16.    JMP MAIN                   ;入口
  17. .ORG 0X0004
  18.    JMP INTERRUPT
  19. ;*************************************************************
  20. *****************
  21. ;* 函 数 名: DIG_DATA
  22. ;* 函数功能: 数码管显示数据编码
  23. ;* 入口参数: 无
  24. ;* 返    回: R0,数码管显示的编码值
  25. ;* 注  意 : 查表函数需在程序开头定义,避免编译后表中元素存在Flash的不
  26. 同页造成查表出错
  27. ;*************************************************************
  28. *****************
 楼主| 家有两宝呀 发表于 2020-11-29 15:13 | 显示全部楼层
3.4.2 汇编程序代码
  1. INCLUDE "KF8F312.INC"
  2. ;;;;;;;;;;;;;;;;通用寄存器;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. DELAY_NUM1    .EQU 0X81    ;延时用的临时变量
  4. DELAY_NUM2    .EQU 0X82    ;延时用的临时变量
  5. PSW_TEMP    .EQU 0X85    ;PSW的临时保存变量
  6. PCH_TEMP    .EQU 0X86    ;PCH的临时保存变量
  7. UNIT     .EQU 0X88    ;数码管个位
  8. DECADE     .EQU 0X89    ;数码管十位
  9. HUNDRED     .EQU 0X8A    ;数码管百位
  10. THOUSAND    .EQU 0X8B    ;数码管千位
  11. DIS_DEL     .EQU 0X8C    ;DIS_DEL是用来延时数值的递增用的,
  12. 数值越大,那么递增的速度就越慢
  13. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  14. .ORG 0X0000
  15.    NOP
  16.    JMP MAIN                   ;入口
  17. .ORG 0X0004
  18.    JMP INTERRUPT
  19. ;*************************************************************
  20. *****************
  21. ;* 函 数 名: DIG_DATA
  22. ;* 函数功能: 数码管显示数据编码
  23. ;* 入口参数: 无
  24. ;* 返    回: R0,数码管显示的编码值
  25. ;* 注  意 : 查表函数需在程序开头定义,避免编译后表中元素存在Flash的不
  26. 同页造成查表出错
  27. ;*************************************************************
  28. *****************
 楼主| 家有两宝呀 发表于 2020-11-29 15:12 | 显示全部楼层
  1. void Display()
  2. {
  3. uint i; // 控制显示时长,确定自增的速度
  4. for(i = 0; i < 500; i++)
  5. {
  6. P2 = 0XE0; //打开数码管的 个位
  7. P1 = Arr_num[Unit];
  8. Delay_200us();
  9. P1 = 0;
  10. P2 = 0XF0; //消影
  11. P2 = 0XD0; //打开数码管的 十位
  12. P1 = Arr_num[Decade];
  13. Delay_200us();
  14. P1 = 0;
  15. P2 = 0XF0; //消影
  16. P2 = 0XB0; //打开数码管的 百位
  17. P1 = Arr_num[Hundred];
  18. Delay_200us();
  19. P1 = 0;
  20. P2 = 0XF0; //消影
  21. P2 = 0X70; //打开数码管的 千位
  22. P1 = Arr_num[Thousand];
  23. Delay_200us();
  24. P1 = 0;
  25. P2 = 0XF0; //消影
  26. }
  27. }
  28. /************************
  29. * 函数名 :Delay_200us
  30. * 函数功能:短时间延时
  31. * 入口参数:无
  32. * 返回 :无
  33. ************************/
  34. void Delay_200us()
  35. {
  36. uchar i = 60;
  37. while(--i);
  38. }
  39. /************************
  40. * 函数名 :main
  41. * 函数功能:程序入口主函数
  42. * 入口参数:无
  43. * 返回 :无
  44. ************************/
  45. void main()
  46. {
  47. Unit = Decade = Hundred = Thousand = 0;
  48. Init_fun();
  49. while(1)
  50. {
  51. Unit++; //个位加1
  52. if(Unit == 10) //如果个位的值加到10,那么个位归零,
  53. 十位加1,以下以此类推
  54. {
  55. Unit = 0;
  56. Decade++;
  57. if(Decade == 10)
  58. {
  59. Decade = 0;
  60. Hundred++;
  61. if(Hundred == 10)
  62. {
  63. Hundred = 0;
  64. Thousand++;
  65. if(Thousand == 10)
  66. {
  67. Thousand = 0;
  68. }
  69. }
  70. }
  71. }
  72. Display(); //显示函数调用
  73. }
  74. }
  75. //中断函数
  76. void int_fun() __interrupt
  77. {
  78. }
 楼主| 家有两宝呀 发表于 2020-11-29 15:11 | 显示全部楼层
  1. #include<kf8f312.h>
  2. /*********************宏定义******************************/
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. /*********************宏定义结束**************************/
  6. /*********************全局变量****************************/
  7. uchar const Arr_num[] = {0X3F,
  8. 0X06,
  9. 0X5B,
  10. 0X4F,
  11. 0X66,
  12. 0X6D,
  13. 0X7D,
  14. 0X07,
  15. 0X7F,
  16. 0X6F
  17. }; //共阴接法
  18. uchar Unit, Decade, Hundred, Thousand; //定义个十百千位
  19. /*********************全局变量结束************************/
  20. /******************函数声明*******************************/
  21. void Init_fun();
  22. void Display();
  23. void Delay_200us();
  24. /******************函数声明结束***************************/
  25. /************************
  26. * 函数名 :init_fun
  27. * 函数功能:初始化函数
  28. * 入口参数:无
  29. * 返回 :无
  30. ************************/
 楼主| 家有两宝呀 发表于 2020-11-29 15:10 | 显示全部楼层
综上,该程序主要包含以下几块:
① 器件初始化子函数
② 数码管显示子函数
③ 主函数(数值累加循环显示)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

584

帖子

0

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