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

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

 楼主| 家有两宝呀 发表于 2020-11-29 14:39 | 显示全部楼层
硬件说明
KF8F312单片机的P1端口P10-P17连接七段数码管的a,b,c,d,e,f,g,dp。
P24-P27分别接显示位(个位,十位,百位,千位)的公共端, 该数码管为共阴
数码管,所以若要点亮数码管,首先将该位的显示公共端置低电平,然后将要显
示的那一段置高电平。如:要在个位上显示0,需将P24置低电平,P10-P15置高
电平,P16,P17置低电平。原理图如图1,图2所示。单片机的P10~P17跳上跳
线,P24~P27跳上跳线,所需跳线如图3所示。
119295fc3422b7063a.png
 楼主| 家有两宝呀 发表于 2020-11-29 14:43 | 显示全部楼层
 楼主| 家有两宝呀 发表于 2020-11-29 14:44 | 显示全部楼层
程序设计说明
由于驱动数码管使用到了P1、P2端口,所以首先需将P1、P2端口方向设置为
输出。由于个十百千位共用了P1端口,所以只能分时显示各位,先显示第一位,
再显示第二位,依次循环,由于人眼的视觉停留,快速的切换显示位便无法察觉
到。数值计数累加先加个位,如果个位的值加到10,那么个位归零,十位加1,
以此类推。加到10000的时候将每一位清零。数码管显示流程图如图4所示,主函
数运行流程图如图5所示。
 楼主| 家有两宝呀 发表于 2020-11-29 14:46 | 显示全部楼层
综上,该程序主要包含以下几块:
① 器件初始化子函数
② 数码管显示子函数
③ 主函数(数值累加循环显示)
 楼主| 家有两宝呀 发表于 2020-11-29 14:47 | 显示全部楼层
综上,该程序主要包含以下几块:
① 器件初始化子函数
② 数码管显示子函数
③ 主函数(数值累加循环显示)
 楼主| 家有两宝呀 发表于 2020-11-29 14:47 | 显示全部楼层
C程序代码
  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. ************************/
  31. void Init_fun()
  32. {
  33. OSCCTL = 0x60; //设置为8M
  34. /*********端口初始化***********/
  35. TR0 = 0x08; //设置P03端口为输入
  36. TR1 = 0x00; //设置P1端口为输出
  37. TR2 = 0x00; //设置P2端口为输出
  38. P0 = 0;
  39. P1 = 0;
  40. P2 = 0xF0; //关闭数码管位选端
  41. }
  42. /************************
  43. * 函数名 :display
  44. * 函数功能:数码管显示
  45. * 入口参数:显示数字
  46. * 返回 :无
  47. ************************/
  48. void Display()
  49. {
  50. uint i; // 控制显示时长,确定自增的速度
  51. for(i = 0; i < 500; i++)
  52. {
  53. P2 = 0XE0; //打开数码管的 个位
  54. P1 = Arr_num[Unit];
  55. Delay_200us();
  56. P1 = 0;
  57. P2 = 0XF0; //消影
  58. P2 = 0XD0; //打开数码管的 十位
  59. P1 = Arr_num[Decade];
  60. Delay_200us();
  61. P1 = 0;
  62. P2 = 0XF0; //消影
  63. P2 = 0XB0; //打开数码管的 百位
  64. P1 = Arr_num[Hundred];
  65. Delay_200us();
  66. P1 = 0;
  67. P2 = 0XF0; //消影
  68. P2 = 0X70; //打开数码管的 千位
  69. P1 = Arr_num[Thousand];
  70. Delay_200us();
  71. P1 = 0;
  72. P2 = 0XF0; //消影
  73. }
  74. }
  75. /************************
  76. * 函数名 :Delay_200us
  77. * 函数功能:短时间延时
  78. * 入口参数:无
  79. * 返回 :无
  80. ************************/
  81. void Delay_200us()
  82. {
  83. uchar i = 60;
  84. while(--i);
  85. }
  86. /************************
  87. * 函数名 :main
  88. * 函数功能:程序入口主函数
  89. * 入口参数:无
  90. * 返回 :无
  91. ************************/
  92. void main()
  93. {
  94. Unit = Decade = Hundred = Thousand = 0;
  95. Init_fun();
  96. while(1)
  97. {
  98. Unit++; //个位加1
  99. if(Unit == 10) //如果个位的值加到10,那么个位归零,
  100. 十位加1,以下以此类推
  101. {
  102. Unit = 0;
  103. Decade++;
  104. if(Decade == 10)
  105. {
  106. Decade = 0;
  107. Hundred++;
  108. if(Hundred == 10)
  109. {
  110. Hundred = 0;
  111. Thousand++;
  112. if(Thousand == 10)
  113. {
  114. Thousand = 0;
  115. }
  116. }
  117. }
  118. }
  119. Display(); //显示函数调用
  120. }
  121. }
  122. //中断函数
  123. void int_fun() __interrupt
  124. {
  125. }
 楼主| 家有两宝呀 发表于 2020-11-29 14:48 | 显示全部楼层
3.4.2 汇编程序代码
.INCLUDE "KF8F312.INC"
;;;;;;;;;;;;;;;;通用寄存器;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY_NUM1    .EQU 0X81    ;延时用的临时变量
DELAY_NUM2    .EQU 0X82    ;延时用的临时变量
PSW_TEMP    .EQU 0X85    ;PSW的临时保存变量
PCH_TEMP    .EQU 0X86    ;PCH的临时保存变量
UNIT     .EQU 0X88    ;数码管个位
DECADE     .EQU 0X89    ;数码管十位
HUNDRED     .EQU 0X8A    ;数码管百位
THOUSAND    .EQU 0X8B    ;数码管千位
DIS_DEL     .EQU 0X8C    ;DIS_DEL是用来延时数值的递增用的,
数值越大,那么递增的速度就越慢
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.ORG 0X0000
   NOP
   JMP MAIN                   ;入口
.ORG 0X0004
   JMP INTERRUPT
;*************************************************************
*****************
;* 函 数 名: DIG_DATA
;* 函数功能: 数码管显示数据编码
;* 入口参数: 无
;* 返    回: R0,数码管显示的编码值
;* 注  意 : 查表函数需在程序开头定义,避免编译后表中元素存在Flash的不
同页造成查表出错
;*************************************************************
*****************
 楼主| 家有两宝呀 发表于 2020-11-29 14:49 | 显示全部楼层
汇编程序代码
 楼主| 家有两宝呀 发表于 2020-11-29 14:49 | 显示全部楼层
  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 14:50 | 显示全部楼层
  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. ;;;;;;;;;;;;;;;中断部分;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 楼主| 家有两宝呀 发表于 2020-11-29 14:51 | 显示全部楼层
[code]INTERRUPT
;保护现场作用,根据实际情况进行保存,中断内部和外部都使用的资源需要保
护,常规需要保护的内容有PSW PCH R0 R1
SWAPR R1 ,PSW
MOVPSW_TEMP, R1
MOVR1 , PCH
MOVPCH_TEMP, R1  
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;中断处理
;...
;...
;...
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
;恢复现场作用
INT_END
MOVR1 , PCH_TEMP
MOVPCH, R1   
SWAPR R1 , PSW_TEMP
MOV PSW, R1
IRET
;;;;;;;;;;;;;;中断部分结
束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   
   
   
;;;;;;;;;;;;;;入口函数,主程
序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN
CALL INIT_ALL     ;初始化寄存器
    CALL INIT_RAM           ;初始化RAM
LOOP   
INC UNIT       ;个位数字的递增
MOV R0 ,UNIT
XOR R0 ,#0X0A
JB PSW ,Z
JMP C_DIS
CLR UNIT
   
INC DECADE       ;十位数字的递增
MOV R0 ,DECADE
XOR R0 ,#0X0A
JB PSW ,Z
JMP C_DIS
CLR DECADE
   
INC HUNDRED       ;百位数字的递增
MOV R0 ,HUNDRED
XOR R0 ,#0X0A
JB PSW ,Z
JMP C_DIS
CLR HUNDRED
   
INC THOUSAND     ;千位数字的递增
MOV R0 ,THOUSAND
XOR R0 ,#0X0A
JB PSW ,Z
JMP C_DIS  
CLR THOUSAND
   
C_DIS   
MOV R0,#0x33
MOV DIS_DEL,R0     ;DIS_DEL是用来延时数值的递增用的,数值越
大,那么递增的速度就越慢
CALL LED_DISPLAY    ;数码管显示当前数值
DECJZ DIS_DEL   
JMP $‐2         ;调整地址以当前地址减2的位置
JMP LOOP
   
CRET
;*************************************************************
*****************
;* 函 数 名: INIT_ALL
;* 函数功能: 初始化函数,对各种寄存器的初始化
;* 入口参数: 无
;* 返    回: 无
;*************************************************************
 楼主| 家有两宝呀 发表于 2020-11-29 14:52 | 显示全部楼层
  1. INIT_ALL
  2. ;调入校准信息到控制寄存器
  3. CALL #0xFFF
  4. MOV OSCCAL0, R0    ;晶振校准0
  5. NOP
  6. NOP
  7. CALL #0xFFE
  8. MOV OSCCAL1, R0    ;晶振校准1
  9. NOP
  10. NOP
  11. ;选择工作频率
  12. MOV R0 ,#0x60   
  13. MOV OSCCTL, R0    ;设置为8M
  14. ;端口初始化
  15. ;***端口初始化********
  16. MOV R0 ,#0x08
  17. MOV TR0, R0      ;设置P0端口为输入
  18. MOV R0 ,#0x00
  19. MOV TR1, R0      ;设置P1端口为输出
  20. MOV R0 ,#0X00
  21. MOV TR2, R0      ;设置P2端口为输出
  22.    
  23. CLR P0
  24. CLR P1
  25. MOV R0 ,#0XF0       ;关闭数码管位选端
  26. MOV P2, R0      
  27. CRET
  28. ;*************************************************************
  29. *****************
  30. ;* 函 数 名: LED_DISPLAY
  31. ;* 函数功能: 数码管显示函数,由4个8位LED灯显示
  32. ;* 入口参数: THOUSAND 千位 ,HUNDRED 百位 ,SMQ_S 十位, UNIT 个位  ,
  33. 每个数的范围 0~f
  34. ;* 返    回: 无
  35. ;*************************************************************
  36. *****************
 楼主| 家有两宝呀 发表于 2020-11-29 14:52 | 显示全部楼层
  1. LED_DISPLAY
  2. MOV R0 , #0XE0
  3. MOV P2 , R0        ;打开数码管的 个位
  4. MOV R2 , UNIT
  5. CALL DIG_DATA
  6. MOV P1 , R0
  7. CALL DELAY
  8. CLR P1     ;消隐
  9. MOV R0 ,#0XF0
  10. MOV P2 , R0
  11.    
  12. MOV R0 ,#0XD0
  13. MOV P2 , R0        ;打开数码管的 十位
  14. MOV R2 , DECADE
  15. CALL DIG_DATA
  16. MOV P1 , R0
  17. CALL DELAY
  18. CLR P1     ;消隐
  19. MOV R0 ,#0XF0
  20. MOV P2 , R0
  21. MOV R0 , #0XB0   
  22. MOV P2 , R0        ;打开数码管的 百位
  23. MOV R2 , HUNDRED
  24. CALL DIG_DATA
  25. MOV P1 , R0
  26. CALL DELAY
  27. CLR P1     ;消隐
  28. MOV R0 ,#0XF0
  29. MOV P2 , R0   
  30. MOV R0 , #0X70   
  31. MOV P2 , R0        ;打开数码管的 千位
  32. MOV R2 , THOUSAND
  33. CALL DIG_DATA
  34. MOV P1 , R0
  35. CALL DELAY
  36. CLR P1     ;消隐
  37. MOV R0 ,#0XF0
  38. MOV P2 , R0   
  39. CRET
  40. ;*************************************************************
  41. *****************
  42. ;* 函 数 名: DELAY
  43. ;* 函数功能: 延时函数,时间为1ms
  44. ;* 入口参数: 无
  45. ;* 返    回: 无
  46. ;*************************************************************
  47. *****************
  48. DELAY
  49. MOV R0,#0x12
  50. MOV DELAY_NUM1, R0
  51. LP0
  52. MOV R0,#0X12
  53. MOV DELAY_NUM2, R0
  54. LP1
  55. DECJZ DELAY_NUM2    ;DELAY_NUM2自减1,若为0,则跳过
  56. JMP LP1
  57. DECJZ DELAY_NUM1    ;DELAY_NUM1自减1,若为0,则跳过
  58. JMP LP0      
  59. CRET         ;子程序返回
  60. ;/************************************************************
  61. ******************
  62. ;* 函 数 名: init_RAM
  63. ;* 函数功能: 初始化RAM
  64. ;* 入口参数: 无
  65. ;* 返    回: 无
  66. ;*************************************************************
  67. *****************/
 楼主| 家有两宝呀 发表于 2020-11-29 14:53 | 显示全部楼层
  1. INIT_RAM     
  2. CLR   R2       ;传递默认RAM值
  3. ; CLR RAM SET 0  BANK0
  4. CLR   PSW ,RP0   
  5. MOV   R0 ,#0X80   ;起始地址0x80
  6. MOV   R1 ,#0X20   ;操作个数
  7. CALL    INIT_RAM_0
  8. ; CLR RAM SET 0  BANK1
  9. SET   PSW ,RP0   
  10. MOV   R0 ,#0X80   ;起始地址0x80
  11. MOV   R1 ,#0X01   ;操作个数
  12. CALL    INIT_RAM_0
  13. ; 默认工作区域设定   BANK0
  14. CLR   PSW ,RP0
  15. ; 其他变量的数值操作
  16.    
  17.    
  18.    
  19. CRET
  20. ;;;;;;;;;;;;;;;;;;执行默认数值装载到RAM区
  21. INIT_RAM_0   
  22. ST [R0],R2
  23. INC R0
  24. DECJZ R1
  25. JMP  INIT_RAM_0
  26. CRET  
  27.    
  28. .end
凯复Kane 发表于 2020-12-2 23:36 | 显示全部楼层
写得好详细 顶一个
x史可法 发表于 2020-12-3 23:50 | 显示全部楼层
这个是不是跟隔壁的帖子重复了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

585

帖子

0

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