[示例代码] I/O口作为输入输出实验 【转】

[复制链接]
1251|10
 楼主| 家有两宝呀 发表于 2020-11-29 12:35 | 显示全部楼层 |阅读模式
KF8F系列单片机开发板演示程序 项目名: 01-Input_Output_TEST 开发环境:ChipON IDE作者:上海芯旺微电子有限公司 功能简述: I/O作为输入输出控制功能时,当有按键按下,则改变相应LED显示状态。S3控制LED1,S4控制LED2。





 楼主| 家有两宝呀 发表于 2020-11-29 12:35 | 显示全部楼层
D3发光二极管的正极接地,负极接KF8F312单片机的P16端口,所以要点亮D3
发光二极管,只需配置P16端口为输出口,并让其输出低电平即可。连接按键的
端口配置为输入状态,当检测到按键按下时分别改变相应LED的显示状态。 J13、
J14要跳上跳线帽,如图。
 楼主| 家有两宝呀 发表于 2020-11-29 12:36 | 显示全部楼层
 楼主| 家有两宝呀 发表于 2020-11-29 12:37 | 显示全部楼层
 楼主| 家有两宝呀 发表于 2020-11-29 12:37 | 显示全部楼层
程序设计说明
程序设计的重点为把单片机的P16口配置为输出口,然后让其输出低电平。
根据芯片手册,把方向控制寄存器TR1的相应位写入0,即可把对应的IO口配置为
输出口, 把状态寄存器P1的相应位置0,即可让其输出低电平。
 楼主| 家有两宝呀 发表于 2020-11-29 12:38 | 显示全部楼层
C程序代码
  1. #include<KF8F312.h>
  2. /*********************宏定义******************************/
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define LED1 P16 // 对应Demo板上的D3
  6. #define LED2 P17 // 对应Demo板上的D4
  7. #define S3 P04
  8. #define S4 P02
  9. /*********************宏定义结束**************************/
  10. /************************
  11. * 函数名 :init_fun
  12. * 函数功能:初始化函数
  13. * 入口参数:无
  14. * 返回 :无
  15. ************************/
  16. void Init_fun()
  17. {
  18. OSCCTL = 0x60; //设置系统时钟为8M/*********端口初始化***********/
  19. TR0 = 0x1c; //设置P03端口只能设置为输入,按
  20. 键接口P02、P04需配置为输入口
  21. TR1 = 0x00; //设置P1端口为输出
  22. TR2 = 0x00; //设置P2端口为输出
  23. P0 = 0;
  24. P1 = 0;
  25. P2 = 0XF0; //关闭数码管位选端
  26. }
  27. /************************
  28. * 函数名 :Delay_ms
  29. * 函数功能:长时间延时
  30. * 入口参数: 延时时长
  31. * 返回 :无
  32. ************************/
  33. void Delay_ms(uchar ms_data)
  34. {
  35. uchar i;
  36. while(ms_data--)
  37. {
  38. i = 200; // 根据晶振的选择设定合适的值
  39. while(i--);
  40. }
  41. }
  42. /************************
  43. * 函数名 :main
  44. * 函数功能:主函数
  45. * 入口参数:
  46. * 返回 :
  47. ************************/
  48. void main()
  49. {
  50. Init_fun(); // 端口初始化
  51. while (1)
  52. {
  53. if (!S3)
  54. {
  55. Delay_ms(10); // 消抖延时
  56. if (!S3)
  57. {
  58. LED1 = !LED1; // LED1状态取反while (!S3); // 等待按键释放
  59. }
  60. }
  61. if (!S4)
  62. {
  63. Delay_ms(10); // 消抖延时
  64. if (!S4)
  65. {
  66. LED2 = !LED2; // LED2状态取反
  67. while (!S4); // 等待按键释放
  68. }
  69. }
  70. }
  71. }
  72. /************************
  73. * 函数名 :int_fun
  74. * 函数功能:__interrupt
  75. * 入口参数:
  76. * 返回 :
  77. ************************/
  78. void int_fun() __interrupt
  79. {
  80. }
 楼主| 家有两宝呀 发表于 2020-11-29 12:39 | 显示全部楼层
汇编程序代码
  1. .INCLUDE "KF8F312.INC"
  2. DELAY_NUM0       .EQU     0x80     ;延时用的临时变量
  3. DELAY_NUM1       .EQU     0x81    ;延时用的临时变量
  4. PSW_TEMP          .EQU     0X85    ;PSW的临时保存变量
  5. PCH_TEMP       .EQU     0X86    ;PCH的临时保存变量
  6. .ORG 0X0000
  7. NOP
  8. JMP MAIN
  9. .ORG 0X0004
  10. JMP INTERRUPT   
  11. INTERRUPT
 楼主| 家有两宝呀 发表于 2020-11-29 12:41 | 显示全部楼层
  1. ;保护现场作用,根据实际情况进行保存,中断内部和外部都使用的资源需要保
  2. 护,常规需要保护的内容有PSW PCH R0 R1 SWAPR R1 ,PSW
  3. MOVPSW_TEMP, R1
  4. MOVR1 , PCH
  5. MOVPCH_TEMP, R1  
  6. ;/*********************************中断处理程序
  7. ***********************************/
  8. ;/*********************************中断处理程序
  9. ***********************************/
  10.    
  11. ;恢复现场作用
  12. INT_END
  13. MOVR1 , PCH_TEMP
  14. MOVPCH, R1   
  15. SWAPR R1 , PSW_TEMP
  16. MOV PSW, R1
  17. IRET
  18.    
  19. MAIN
  20. CALL INIT_ALL          ;初始化寄存器
  21. CALL INIT_RAM            ;初始化RAM
  22. LOOP                            ; S3
  23. JNB P0,P04
  24. JMP LOOP3
  25. CALL DELAY_MS                 ; 消抖延时  
  26. JNB P0,P04
  27. JMP LOOP3
  28. MOV R0,#0X40                  ; LED1状态取反
  29. XOR P1,R0
  30. LOOP2
  31. JB P0,P04                     ; 等待按键释放
  32. JMP LOOP2
  33. LOOP3                            ; S4
  34. JNB P0,P02
  35. JMP LOOP
  36. CALL DELAY_MS                 ; 消抖延时  
  37. JNB P0,P02
  38. JMP LOOP
  39. MOV R0,#0X80                  ; LED1状态取反
  40. XOR P1,R0
  41. LOOP4
  42. JB P0,P02                     ; 等待按键释放
  43. JMP LOOP4
  44.    
  45. JMP LOOP     
  46. CRET
  47. ;*************************************************************
  48. *****************
  49. ;* 函 数 名: INIT_ALL
  50. ;* 函数功能: 初始化函数,对各种寄存器的初始化
  51. ;* 入口参数: 无
  52. ;* 返    回: 无
  53. ;*************************************************************
  54. *****************
 楼主| 家有两宝呀 发表于 2020-11-29 12:42 | 显示全部楼层
  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. MOV R0,#0x1c         ;配置按键P02 P04 IO口未输入模式
  16. MOV TR0,R0
  17. MOV R0,#0X00
  18. MOV TR1,R0
  19. MOV R0,#0X00        ;设置P2端口为输出,数码管位选设置为输入,关闭
  20. 数码管显示
  21. MOV TR2,R0
  22.    
  23. CLR P0
  24. CLR P1
  25. MOV R0,#0XF0        ;关闭数码管位选端
  26. MOV P2,R0
  27. CRET  
  28.    
  29. ;/************************************************************
  30. ******************
  31. ;* 函 数 名: init_RAM
  32. ;* 函数功能: 根据数据使用情况,默认RAM数值
  33. ;* 入口参数: 无
  34. ;* 返    回: 无
  35. ;*************************************************************
  36. *****************/
  37. INIT_RAM     
  38. CLR   R2       ;传递默认RAM值
  39. ; CLR RAM SET 0  BANK0
  40. CLR   PSW ,RP0   
  41. MOV   R0 ,#0X80   ;起始地址0x80
  42. MOV   R1 ,#0X20   ;操作个数
  43. CALL    INIT_RAM_0
  44. ; CLR RAM SET 0  BANK1
  45. SET   PSW ,RP0   
  46. MOV   R0 ,#0X80   ;起始地址0x80
  47. MOV   R1 ,#0X01   ;操作个数
  48. CALL    INIT_RAM_0
  49. ; 默认工作区域设定   BANK0
  50. CLR   PSW ,RP0
  51. ; 其他变量的数值操作
  52.    
  53.    
  54. CRET
  55. ;;;;;;;;;;;;;;;;;;执行默认数值装载到RAM区
  56. INIT_RAM_0   
  57. ST [R0],R2
  58. INC R0
  59. DECJZ R1
  60. JMP  INIT_RAM_0
  61. CRET  
  62. ;*************************************************************
  63. *****************
  64. ;* 函 数 名: DELAY
  65. ;* 函数功能: 延时函数,时间为1ms
  66. ;* 入口参数: 无
  67. ;* 返    回: 无
  68. ;*************************************************************
  69. *****************
  70. DELAY_MS
  71. MOV   R0 ,#0xC8
  72. MOV   DELAY_NUM0, R0
  73. LP0
  74. CWDT
  75. MOV   R0 ,#0XC8
  76. MOV   DELAY_NUM1, R0
  77. LP1
  78. DECJZ  DELAY_NUM1    ;DELAY_NUM2自减1,若为0,则跳过
  79. JMP   LP1
  80. DECJZ  DELAY_NUM0    ;DELAY_NUM1自减1,若为0,则跳过
  81. JMP   LP0
  82. CRET
  83. .END
名字是啥样 发表于 2020-12-12 17:09 | 显示全部楼层
这个开发板在哪里申请的?
fuqinyyy 发表于 2020-12-13 17:35 | 显示全部楼层
写的详细啊,感谢分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

585

帖子

0

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