找回密码
 立即注册
查看: 230|回复: 6

请教STC单片机端口的内置上拉电阻应用问题。

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-09-18 10:13:59
已绑定手机

1

主题

4

回帖

51

积分

注册会员

积分
51
发表于 2025-9-17 10:42:29 | 显示全部楼层 |阅读模式
各位大神好:请教STC单片机端口的内置上拉电阻应用问题。使用STC8H1K08-20设计一款共阴数码管显示温度表。P1.0~1.7用作段驱动。预想利用内置上拉电阻代替限流电阻。结果样品出来数码管亮度达不到预期。后在STC8H8K64U实验板上测试,准双向IO口外接300欧负载电阻,测量高电平输出电流0.28mA,使能上拉电阻POPU、使能驱动电流PODR都无效,IO口高电平输出电流依然是0.28mA不变。用户手册中关于上拉电阻介绍只一带而过,也没有应用实例。特此向各位大神请教,谢谢!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:560
  • 最近打卡:2025-10-16 05:35:53
已绑定手机

17

主题

768

回帖

2322

积分

金牌会员

积分
2322
发表于 2025-9-17 14:10:27 | 显示全部楼层
单片机内部上拉电阻阻值较大,达到几K欧姆,所以电流很小
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:560
  • 最近打卡:2025-10-16 05:35:53
已绑定手机

17

主题

768

回帖

2322

积分

金牌会员

积分
2322
发表于 2025-9-17 14:12:12 | 显示全部楼层
查看数据手册,上拉电阻阻值,3V时为6K左右,5V时4.2K左右
截图202509171411377718.jpg
截图202509171412108307.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:585
  • 最近打卡:2025-10-16 07:20:54
已绑定手机

86

主题

6274

回帖

1万

积分

超级版主

积分
11738
发表于 2025-9-17 15:04:35 | 显示全部楼层
驱动数码管建议使用8H4K64TL,80mA大电流IO,硬件自动扫描
上拉电阻可以使用配置工具生成代码
截图202509171504066487.jpg


回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-09-18 10:13:59
已绑定手机

1

主题

4

回帖

51

积分

注册会员

积分
51
发表于 2025-9-18 10:13:59 | 显示全部楼层
Debu*** 发表于 2025-9-17 15:04
驱动数码管建议使用8H4K64TL,80mA大电流IO,硬件自动扫描
上拉电阻可以使用配置工具生成代码

按正常设计应该设置P1推挽模式并串接1K左右限流电阻。之所以想利用内置上拉4K电阻的目的是为了掌握这个功能的应用。在此次试验中数码管的亮度并没有因为使能4.2K上拉电阻有任何变化,测量端口输出电流也没有发生任何变化。也就是无法证明4.2K上拉电阻使能。
001.jpg 无标题012.jpg

  1. //        数码管显示-30~150度温度计
  2. //        单片机型号STC8系列
  3. //        使用芯片内部时钟11.0592MHz
  4. //        传感器NTC温敏电阻10K B3950  
  5. //  上分压电阻10K
  6. #include "stc8h.h"            
  7. #include "intrins.h"
  8. #define uchar unsigned char
  9. #define uint unsigned int
  10. #define key_S 5                                              //宏定义短按(约10ms)
  11. #define key_L key_S*100                              //宏定义长按(约500ms)
  12. #define key_I key_S*80                              //宏定义长按连+/-间隔(约200ms)
  13. //宏定义ADC的操作命令
  14. #define ADCTIM  (*(unsigned char volatile xdata *)0xfea8)
  15. #define ADC_POWER   0x80            //ADC power control dit (宏定义ADC电源控制位)1000 0000
  16. #define ADC_START   0x40            //ADC start control dit (宏定义ADC启动控制位)0100 0000
  17. #define ADC_FLAG    0x20            //ADC complete flag (宏定义ADC完成标志位)    0010 0000
  18. #define ADC_EPWMT   0x10            //使能 PWM  实时触发 ADC                     0001 0000
  19. #define ADC_L       3879                           //测温下限
  20. #define ADC_H         76                           //测温上限
  21. //宏定义ISP的操作命令
  22. #define CMD_IDLE    0               //空闲模式
  23. #define CMD_READ    1               //IAP字节读命令
  24. #define CMD_PROGRAM 2               //IAP字节编程命令
  25. #define CMD_ERASE   3               //IAP扇区擦除命令
  26. #define ENABLE_IAP  12              //CPU的等待时间
  27. #define IAP_ADDRESS 0x0000          //测试地址
  28. //端口定义
  29. sbit K1 =P3^2;
  30. sbit K2 =P3^1;
  31. sbit K3 =P3^0;
  32. sbit OUT=P5^4;
  33. //本地变量声明
  34. uchar code table[]={//共阴数码管段码"0~f-."
  35.         0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  36.         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x80};
  37. uchar data dis_buf[8];//显示缓存
  38. uint  Sample; //ADC采样值Sample
  39. bit   flag=0; //中断标志
  40. bit   Success; //采样完成标志
  41. bit   Key_value;//键值
  42. uint  Threshold=310;//OUT开关阈值
  43. uint  num;
  44. char  Error;  //误差补偿
  45. // 10K B3950 NTC温阻电压编码表
  46. // 上分压电阻10K AD值放大4倍
  47. uint code T_Value[183]={
  48. // ADC值    温度 下标
  49. 3892         ,//        -31           0
  50. 3879         ,//        -30           1
  51. 3866         ,//        -29           2
  52. 3852         ,//        -28           3
  53. 3837         ,//        -27           4
  54. 3822         ,//        -26           5
  55. 3806         ,//        -25           6
  56. 3790         ,//        -24           7
  57. 3772         ,//        -23           8
  58. 3754         ,//        -22           9
  59. 3735         ,//        -21           10
  60. 3716         ,//        -20           11
  61. 3695         ,//        -19           12
  62. 3674         ,//        -18           13
  63. 3651         ,//        -17           14
  64. 3628         ,//        -16           15
  65. 3604         ,//        -15           16
  66. 3580         ,//        -14           17
  67. 3554         ,//        -13           18
  68. 3527         ,//        -12           19
  69. 3500         ,//        -11           20
  70. 3471         ,//        -10           21
  71. 3442         ,//        -9           22
  72. 3411         ,//        -8           23
  73. 3380         ,//        -7           24
  74. 3348         ,//        -6           25
  75. 3315         ,//        -5           26
  76. 3281         ,//        -4           27
  77. 3247         ,//        -3           28
  78. 3211         ,//        -2           29
  79. 3175         ,//        -1           30
  80. 3138         ,//        0           31
  81. 3100         ,//        1           32
  82. 3061         ,//        2           33
  83. 3022         ,//        3           34
  84. 2981         ,//        4           35
  85. 2941         ,//        5           36
  86. 2900         ,//        6           37
  87. 2858         ,//        7           38
  88. 2815         ,//        8           39
  89. 2772         ,//        9           40
  90. 2728         ,//        10           41
  91. 2684         ,//        11           42
  92. 2641         ,//        12           43
  93. 2595         ,//        13           44
  94. 2550         ,//        14           45
  95. 2505         ,//        15           46
  96. 2460         ,//        16           47
  97. 2414         ,//        17           48
  98. 2368         ,//        18           49
  99. 2323         ,//        19           50
  100. 2277         ,//        20           51
  101. 2231         ,//        21           52
  102. 2186         ,//        22           53
  103. 2140         ,//        23           54
  104. 2095         ,//        24           55
  105. 2050         ,//        25           56
  106. 2005         ,//        26           57
  107. 1961         ,//        27           58
  108. 1917         ,//        28           59
  109. 1873         ,//        29           60
  110. 1830         ,//        30           61
  111. 1787         ,//        31           62
  112. 1745         ,//        32           63
  113. 1702         ,//        33           64
  114. 1661         ,//        34           65
  115. 1620         ,//        35           66
  116. 1580         ,//        36           67
  117. 1540         ,//        37           68
  118. 1502         ,//        38           69
  119. 1463         ,//        39           70
  120. 1425         ,//        40           71
  121. 1389         ,//        41           72
  122. 1352         ,//        42           73
  123. 1317         ,//        43           74
  124. 1282         ,//        44           75
  125. 1247         ,//        45           76
  126. 1214         ,//        46           77
  127. 1181         ,//        47           78
  128. 1149         ,//        48           79
  129. 1117         ,//        49           80
  130. 1087         ,//        50           81
  131. 1057         ,//        51           82
  132. 1028         ,//        52           83
  133. 999         ,//        53           84
  134. 971         ,//        54           85
  135. 944         ,//        55           86
  136. 917         ,//        56           87
  137. 891         ,//        57           88
  138. 866         ,//        58           89
  139. 842         ,//        59           90
  140. 818         ,//        60           91
  141. 795         ,//        61           92
  142. 772         ,//        62           93
  143. 750         ,//        63           94
  144. 729         ,//        64           95
  145. 708         ,//        65           96
  146. 688         ,//        66           97
  147. 668         ,//        67           98
  148. 649         ,//        68           99
  149. 631         ,//        69           100
  150. 612         ,//        70           101
  151. 595         ,//        71           102
  152. 578         ,//        72           103
  153. 561         ,//        73           104
  154. 546         ,//        74           105
  155. 530         ,//        75           106
  156. 515         ,//        76           107
  157. 501         ,//        77           108
  158. 486         ,//        78           109
  159. 473         ,//        79           110
  160. 459         ,//        80           111
  161. 446         ,//        81           112
  162. 434         ,//        82           113
  163. 421         ,//        83           114
  164. 410         ,//        84           115
  165. 398         ,//        85           116
  166. 387         ,//        86           117
  167. 376         ,//        87           118
  168. 366         ,//        88           119
  169. 356         ,//        89           120
  170. 346         ,//        90           121
  171. 336         ,//        91           122
  172. 327         ,//        92           123
  173. 318         ,//        93           124
  174. 309         ,//        94           125
  175. 301         ,//        95           126
  176. 293         ,//        96           127
  177. 285         ,//        97           128
  178. 277         ,//        98           129
  179. 270         ,//        99           130
  180. 262         ,//        100        131
  181. 255         ,//        101        132
  182. 248         ,//        102        133
  183. 242         ,//        103        134
  184. 236         ,//        104        135
  185. 229         ,//        105        136
  186. 223         ,//        106        137
  187. 218         ,//        107        138
  188. 212         ,//        108        139
  189. 206         ,//        109        140
  190. 201         ,//        110        141
  191. 196         ,//        111        142
  192. 191         ,//        112        143
  193. 186         ,//        113        144
  194. 181         ,//        114        145
  195. 177         ,//        115        146
  196. 172         ,//        116        147
  197. 168         ,//        117        148
  198. 164         ,//        118        149
  199. 160         ,//        119        150
  200. 155         ,//        120        151
  201. 152         ,//        121        152
  202. 148         ,//        122        153
  203. 144         ,//        123        154
  204. 141         ,//        124        155
  205. 137         ,//        125        156
  206. 134         ,//        126        157
  207. 131         ,//        127        158
  208. 127         ,//        128        159
  209. 124         ,//        129        160
  210. 121         ,//        130        161
  211. 119         ,//        131        162
  212. 116         ,//        132        163
  213. 113         ,//        133        164
  214. 110         ,//        134        165
  215. 108         ,//        135        166
  216. 105         ,//        136        167
  217. 103         ,//        137        168
  218. 100         ,//        138        169
  219. 98         ,//        139        170
  220. 96         ,//        140        171
  221. 94         ,//        141        172
  222. 92         ,//        142        173
  223. 89         ,//        143        174
  224. 87         ,//        144        175
  225. 85         ,//        145        176
  226. 84         ,//        146        177
  227. 82         ,//        147        178
  228. 80         ,//        148        179
  229. 78         ,//        149        180
  230. 76         ,//        150        181
  231. 74          //        151        182
  232. };
  233. //本地函数声明
  234. void Init_ADC();                      //初始化ADC
  235. uint Read(uchar ch);                  //ADC转换
  236. void LB_ADC();                        //ADC滤波
  237. void display();                       //数码管显示
  238. void delayms(uint z);                 //延时
  239. void Timer0Init();                    //定时器初始化
  240. void key_scan();                      //按键扫描
  241. //EEPROM操作函数声明*****************************************
  242. void  IapIdle();                      //关闭IAP/EEPROM
  243. uchar IapRead(uint addr);             //读取EEPROM数据
  244. void  IapProgram(uint addr,uchar dat);//写入EEPROM数据
  245. void  IapErase(uint addr);            //擦除EEPROM数据
  246. void main()
  247. {         
  248.         int temp;
  249.         uchar i,j,k,L,M,H;
  250.         //端口模式设置
  251.         OUT=0;
  252.         P1PU = 0xff;                      //P1使能上拉电阻;
  253.         P1M0 = 0x00; P1M1 = 0x00;         //P1准双向;
  254.         P3M0 = 0x00; P3M1 = 0x08;         //设置P3.3高阻
  255.         P5M0 = 0x10; P5M1 = 0x00;         //设置P5.4推挽
  256.         Init_ADC();                                          //初始化ADC
  257.         Timer0Init();                                  //定时器初始化
  258.         if(IapRead(IAP_ADDRESS)==0xff)    //初次上电,EEPROM没有数据
  259.         {
  260.                 IapProgram(IAP_ADDRESS,Threshold>>8);//阈值高8位
  261.                 IapProgram(IAP_ADDRESS+1,Threshold);//阈值低8位
  262.         }
  263.         else
  264.         {
  265.                 Threshold=IapRead(IAP_ADDRESS)<<8|IapRead(IAP_ADDRESS+1);//读EEPROM保存的阈值数据
  266.         }
  267.         WDT_CONTR = 0x23;                 //使能看门狗,溢出时间约为0.5s
  268.         while(1)
  269.         {
  270.                 if(flag)                                  //查询中断完成标志 2毫秒
  271.                 {
  272.                         flag=0;                                  //中断完成标志清0
  273.                         L=0;                                          //对分查表索引最小值 -31度
  274.                         H=182;                                  //对分查表索引最大值 151度
  275.                         display();                          //数码管显示程序
  276.                         if(++j>=10)
  277.                         {
  278.                                 j=0;
  279.                                 LB_ADC();                          //ADC滤波程序
  280.                         }
  281.                         if(Success)               //ADC采样完成
  282.                         {
  283.                                 Success=0;            //采样完成标志清0
  284.                                 if(Sample>ADC_L || Sample<ADC_H)//判断超出测温范围
  285.                                 {
  286.                                         dis_buf[0] = 0x79;//显示"E"
  287.                                         dis_buf[1] = 0x00;
  288.                                         dis_buf[2] = 0x00;
  289.                                         dis_buf[3] = 0x00;
  290.                                 }
  291.                                 else
  292.                                 {
  293.                                         for(i=0;i<5;i++)        //对分查表
  294.                                         {
  295.                                                 M=(L+H)/2;
  296.                                                 if(Sample<=T_Value[M])       
  297.                                                         L=M-1;//-1消除非整数误差
  298.                                                 else H=M+1;//+1消除非整小数误差
  299.                                         }
  300.                                         if(Sample==T_Value[L])       
  301.                                         {
  302.                                                 temp=L-31;//-31索引差值
  303.                                         }
  304.                                         else if(Sample==T_Value[H])       
  305.                                         {
  306.                                                 temp=H-31;//-31索引差值
  307.                                         }
  308.                                         else //AD值介于数组两个元素之间
  309.                                         {
  310.                                                 while(L<=H)
  311.                                                 {
  312.                                                         L++;
  313.                                                         if(Sample<=T_Value[L] && Sample>T_Value[L+1])       
  314.                                                         {       
  315.                                                                 temp=L-31;//-31索引差值
  316.                                                                 break;
  317.                                                         }
  318.                                                 }
  319.                                         }
  320.                                         //ADC值换算成温度值
  321.                                         if(temp<0)//低于0度
  322.                                         {
  323.                                                 k=10-((T_Value[L]-Sample)*10/(T_Value[L]-T_Value[L+1]));//小数线性插补放大10倍       
  324.                                                 temp=~temp;                //取反成正数
  325.                                                 temp=temp*10+k;//整数放大10倍+已放大10倍的小数
  326.                                                 if(temp/1000==0&&temp/100>0)//负温度大于10度,千位显示"-"
  327.                                                 {
  328.                                                         dis_buf[0] = 0x40;
  329.                                                         dis_buf[1] = table[temp/100%10];
  330.                                                 }
  331.                                                 else if(temp/1000==0&&temp/100==0)//负温度小于10度,千位不显示,百位显示"-"
  332.                                                 {
  333.                                                         dis_buf[0] = 0x00;
  334.                                                         dis_buf[1] = 0x40;
  335.                                                 }
  336.                                         }
  337.                                         else //0~150度
  338.                                         {
  339.                                                 k=(T_Value[L]-Sample)*10/(T_Value[L]-T_Value[L+1]);//线性插补放大10倍小数
  340.                                                 temp=temp*10+k;//整数放大10倍+放大10倍小数
  341.                                                 if(temp/1000==0) dis_buf[0]=0x00;//温度小于100度,千位不显示
  342.                                                 else dis_buf[0] = table[temp/1000%10];//显示千位温度值               
  343.                                                 if(temp/1000==0&&temp/100==0)dis_buf[1]=0x00;//温度小于10度,百位不显示
  344.                                                 else dis_buf[1] = table[temp/100%10];//显示百位温度值
  345.                                         }
  346.                                         dis_buf[2] = table[temp/10%10]|0x80;//十位加小数点
  347.                                         dis_buf[3] = table[temp%10];        //个位(小数位)
  348.                                 }
  349.                                 if(temp<Threshold)OUT=0;
  350.                                 if(temp>Threshold)OUT=1;
  351.                         }
  352.                         dis_buf[4] = 0x78;//'t'
  353.                         dis_buf[5] = table[Threshold/100%10];                       
  354.                         dis_buf[6] = table[Threshold/10%10]|0x80;                       
  355.                         dis_buf[7] = table[Threshold%10];                       
  356.                         key_scan();
  357.                         if(num>0)
  358.                         {
  359.                                 num--;
  360.                                 if(num==0)
  361.                                 {
  362.                                         Key_value=0;
  363.                                         IapErase(IAP_ADDRESS);        //擦除EEPROM数据               
  364.                                         IapProgram(IAP_ADDRESS,Threshold>>8);//阈值高8位
  365.                                         IapProgram(IAP_ADDRESS+1,Threshold);//阈值低8位
  366.                                 }
  367.                         }
  368.                 }
  369.                 WDT_CONTR = 0x33;         //清看门狗,否则系统复位
  370.         }
  371. }
  372. // 数码管显示程序
  373. void display()
  374. {
  375.         static uchar i=0;      //分时显示变量
  376.         uchar j;
  377.         P1=0x00;               //消隐
  378.         P3&=0x0f;              //清位码(P3高4位)
  379.         switch(i)              //送位码(P3低4位不变)
  380.         {
  381.                 case 0: P3|=0xe0; break;
  382.                 case 1: P3|=0xd0; break;
  383.                 case 2: P3|=0xb0; break;
  384.                 case 3: P3|=0x70; break;
  385.         }
  386.         if(Key_value!=0)j=4;
  387.         else j=0;
  388.         P1=dis_buf[i+j];         //送段码
  389.         i=++i%4;       
  390. }
  391. // T0中断服务程序
  392. void Timer0Interrupt() interrupt 1
  393. {
  394.         flag=1;
  395. }
  396. // 延时程序
  397. void delayms(uint ms)
  398. {
  399.         uint i;
  400.         do
  401.         {
  402.                 i=1106;  //STC8
  403.                 while(--i);
  404.         }
  405.         while(--ms);
  406. }
  407. //定时器T0初始化程序
  408. void Timer0Init(void)       //2毫秒@11.0592MHz
  409. {
  410.         AUXR |= 0x80;            //定时器时钟1T模式
  411.         TMOD &= 0xF0;            //设置定时器模式
  412.         TL0 = 0x9A;              //设置定时初始值
  413.         TH0 = 0xA9;              //设置定时初始值
  414.         TF0 = 0;                 //清除TF0标志
  415.         TR0 = 1;                 //定时器0开始计时
  416.         ET0 = 1;                 //使能定时器0中断
  417.         EA  = 1;                 //开总中断
  418. }
  419. //  ADC初始化程序
  420. void Init_ADC()
  421. {        //ADC 控制器  电源  启动  完成  --   15通道模拟选择位
  422.         //ADC_CONTR    B7    B6    B5   B4   B3   B2   B1   B0
  423.         P_SW2 |= 0x80;                  //打开扩展存储器
  424.         ADCTIM = 0x3f;                  //设置 ADC 内部时序
  425.         P_SW2 &= 0x7f;                  //关闭扩展存储器
  426.         ADCCFG = 0x2f;                  //设置ADC结果右对齐,速度为1/32系统时钟
  427.         ADC_RES=0;                      //清除ADC_RES存储器以前的结果
  428.         ADC_RESL=0;
  429.         ADC_CONTR=ADC_POWER;            //ADC 开启电源
  430.         delayms(1);                     //上电延时1ms
  431. }
  432. //ADC转换程序
  433. uint Read(uchar CH)                                     //获取ADC结果
  434. {
  435.         ADC_CONTR=ADC_POWER|ADC_START|CH;//启动转换1100 1000
  436.         _nop_();_nop_();                //小延时
  437.         while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成标志置位 1010 0000
  438.         ADC_CONTR &=~ADC_FLAG;          //清完成标志
  439.         return ADC_RES<<8|ADC_RESL;     //返回十位ADC结果
  440. }
  441. //  ADC滤波程序
  442. void LB_ADC()
  443. {
  444.         static uint PJZ_ADC=0;          //累计40次采样的变量
  445.         static uchar count=0;           //计数器变量
  446.         PJZ_ADC += Read(11);            //累计40次采样
  447.         count++;                        //计数器变量自+1
  448.         if(count>=40)                    //如果计数4次采样
  449.         {
  450.                 count=0;                     //计数器清0
  451.                 Sample=PJZ_ADC/10;              //获取12位AD值
  452.                 PJZ_ADC=0;                   //采样变量清0
  453.                 Success=1;                   //采样完成
  454.         }
  455. }
  456. //按键扫描
  457. void key_scan()
  458. {
  459.         static unsigned int time=0;
  460.         if(!K1||!K2||!K3)
  461.         {
  462.                 time++;
  463.                 if(time>key_L)//长按有效
  464.                         time=key_I;//连+/-间隔
  465.                 if(time==key_S)//短按消抖
  466.                 {
  467.                         if(!K1)
  468.                         {
  469.                                 Key_value=~Key_value;
  470.                         }
  471.                 }
  472.                 if(time==key_S||time==key_L)//短按消抖或长按连+/-
  473.                 {
  474.                         if(!K2 && Key_value==1)
  475.                         {
  476.                                 Threshold=Threshold+10;
  477.                         }
  478.                         if(!K3 && Key_value==1)
  479.                         {
  480.                                 Threshold=Threshold-10;
  481.                         }
  482.                 }
  483.                 if(Key_value==1)
  484.                         num=2500;
  485.                 else num=1;
  486.         }
  487.         else
  488.         {
  489.                 time=0;
  490.         }
  491. }
  492. //==============EEPROM部分=====================
  493. //        关闭IAP功能
  494. void IapIdle()
  495. {
  496.     IAP_CONTR = 0;                  //关闭IAP功能
  497.     IAP_CMD   = 0;                  //清除命令寄存器
  498.     IAP_TRIG  = 0;                  //清除触发寄存器
  499.     IAP_ADDRH = 0x80;               //将地址设置到非IAP区域
  500.     IAP_ADDRL = 0;
  501. }
  502. //从ISP/IAP/EEPROM区域读取一字节
  503. uchar IapRead(uint addr)
  504. {
  505.     uchar dat;
  506.     IAP_CONTR = 0x80;               //使能IAP
  507.     IAP_TPS = ENABLE_IAP;           //设置等待参数12MHz
  508.     IAP_CMD = CMD_READ;             //设置IAP读命令
  509.     IAP_ADDRL = addr;               //设置IAP低地址
  510.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  511.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  512.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  513.     _nop_();                        //小延时
  514.     dat = IAP_DATA;                 //读IAP数据
  515.     IapIdle();                      //关闭IAP功能
  516.     return dat;
  517. }
  518. //写一字节数据到ISP/IAP/EEPROM区域
  519. void IapProgram(uint addr, uchar dat)
  520. {
  521.     IAP_CONTR = 0x80;               //使能IAP
  522.     IAP_TPS = ENABLE_IAP;           //设置等待参数12MHz
  523.     IAP_CMD = CMD_PROGRAM;          //设置IAP写命令
  524.     IAP_ADDRL = addr;               //设置IAP低地址
  525.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  526.     IAP_DATA = dat;                 //写IAP数据
  527.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  528.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  529.     _nop_();                        //小延时
  530.     IapIdle();                      //关闭IAP功能
  531. }
  532. //ISP/IAP/EEPROM扇区擦除
  533. void IapErase(uint addr)
  534. {
  535.     IAP_CONTR = 0x80;               //使能IAP
  536.     IAP_TPS = ENABLE_IAP;           //设置等待参数12MHz
  537.     IAP_CMD = CMD_ERASE;            //设置IAP擦除命令
  538.     IAP_ADDRL = addr;               //设置IAP低地址
  539.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  540.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  541.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  542.     _nop_();                        //小延时
  543.     IapIdle();                      //关闭IAP功能
  544. }
复制代码


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:524
  • 最近打卡:2025-10-16 10:25:30

9

主题

475

回帖

3325

积分

论坛元老

积分
3325
发表于 2025-9-18 10:56:53 | 显示全部楼层
不要轻易怀疑芯片自身问题,遇到异常请仔细阅读产品手册
使用扩展特殊寄存器XFR的读写,需要先开使能 P_SW2 |= 0x80

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-09-18 10:13:59
已绑定手机

1

主题

4

回帖

51

积分

注册会员

积分
51
发表于 2025-9-18 14:45:32 | 显示全部楼层
网*** 发表于 2025-9-18 10:56
不要轻易怀疑芯片自身问题,遇到异常请仔细阅读产品手册
使用扩展特殊寄存器XFR的读写,需要先开使能 P_SW2 | ...

确如6楼大神所言,先打开扩展存储器P_SW2 |= 0x80;再使能上拉电阻。数码管亮度正常。后用STC8H1K08在实验板上IO口高电平,负载电阻300欧测试验证:未打开P_SW2开关,P1PU设置无效,输出电流0.015mA,打开P_SW2开关,输出电流1.1mA。由此证明P1PU设置有效,利用内置4K上拉电阻代替限流电阻直接驱动共阴数码管切实可行。实物对比图如下:

微信图片000.jpg

回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-16 10:29 , Processed in 0.139211 second(s), 91 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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