请教个问题: 想用PWM控制屏幕亮度,始终达不到目的
<h2>用PWM控制彩屏亮度,但始终没有用</h2><h3>环境</h3>
<p>mcu: STC8H1K08-TSSOP20</p>
<h3>目的</h3>
<p>想用PWM输出引脚(<strong>P1.6</strong>)控制屏幕的BLK针脚,达到控制屏幕亮度的目的</p>
<h3>遇到的问题</h3>
<p>没想到配置之PWM输出这么复杂 :-(。照着手册,逐个bit位配置寄存器,还是没有达到控制屏幕亮度的目的。代码如下:</p>
<p>GPIO配置</p>
<p><code>MOV P1M1, #0BFH </code></p>
<p><code>MOV P1M0, #40H</code></p>
<p>PWM输出配置和中断:</p>
<p><code>PWM4PCONF:</code></p>
<p><code>; PWM4P output pin selection: P1.6 </code></p>
<p><code>MOV DPTR, #PWMA_PS </code></p>
<p><code>MOVX A, @DPTR </code></p>
<p><code>ANL A, #NOT 0C0H </code></p>
<p><code>MOVX @DPTR, A </code></p>
<p><code>; turn off input capture/ compare output </code></p>
<p><code>MOV A, #00H </code></p>
<p><code>MOV DPTR, #PWMA_CCER2 </code></p>
<p><code>MOVX @DPTR, A </code></p>
<p><code>; set output mode to PWMA</code></p>
<p><code>; enable preload func </code></p>
<p><code>MOV DPTR, #PWMA_CCMR4 </code></p>
<p><code>MOVX A, @DPTR </code></p>
<p><code>ORL A, #78H </code></p>
<p><code>MOVX @DPTR, A </code></p>
<p><code>; enable preload buffer and edge align mode</code></p>
<p><code>; counter up </code></p>
<p><code>MOV DPTR, #PWMA_CR1 </code></p>
<p><code>MOVX A, @DPTR </code></p>
<p><code>ORL A, #84H </code></p>
<p><code>ANL A, #NOT 70H </code></p>
<p><code>MOVX @DPTR, A</code><br />
<code>; enable CC4P output </code></p>
<p><code>MOV DPTR, #PWMA_CCER2 </code></p>
<p><code>MOVX A, @DPTR </code></p>
<p><code>ORL A, #10H </code></p>
<p><code>MOVX @DPTR, A </code></p>
<p><code>; setup PWM duty; high byte first </code></p>
<p><code>MOV A, #0FFH </code></p>
<p><code>MOV DPTR, #PWMA_CCR4H </code></p>
<p><code>MOVX @DPTR, A </code></p>
<p><code>MOV A, #0FH </code></p>
<p><code>MOV DPTR, #PWMA_CCR4L </code></p>
<p><code>MOVX @DPTR, A </code></p>
<p><code>; auto-reload value; high byte first </code></p>
<p><code>MOV A, #0FFH </code></p>
<p><code>MOV DPTR, #PWMA_ARRH </code></p>
<p><code>MOVX @DPTR, A </code></p>
<p><code>MOV A, #0FFH </code></p>
<p><code>MOV DPTR, #PWMA_ARRL </code></p>
<p><code>MOVX @DPTR, A </code></p>
<p><code>; enable PWMA update interrupt </code></p>
<p><code>MOV DPTR, #PWMA_IER </code></p>
<p><code>MOVX A, @DPTR </code></p>
<p><code>ORL A, #11H</code></p>
<p><code>; set prescale </code></p>
<p><code>MOV A, #00H </code></p>
<p><code>MOV DPTR, #PWMA_PSCRH </code></p>
<p><code>MOVX @DPTR, A </code></p>
<p><code>MOV A, #00H </code></p>
<p><code>MOV DPTR, #PWMA_PSCRL </code></p>
<p><code>MOVX @DPTR, A </code></p>
<p><code>; re-init counter </code></p>
<p><code>MOV DPTR, #PWMA_EGR </code></p>
<p><code>MOVX A, @DPTR </code></p>
<p><code>ORL A, #01H </code></p>
<p><code>MOVX @DPTR, A </code></p>
<p><code>; enable PWM4P output; disable PWM4N output </code></p>
<p><code>MOV DPTR, #PWMA_ENO </code></p>
<p><code>MOVX A, @DPTR </code></p>
<p><code>ORL A, #40H </code></p>
<p><code>ANL A, #NOT 80H </code></p>
<p><code>MOVX @DPTR, A</code><br />
<code>; extra PWM4P control </code></p>
<p><code>MOV DPTR, #PWMA_IOAUX </code></p>
<p><code>MOVX A, @DPTR </code></p>
<p><code>ORL A, #40H </code></p>
<p><code>MOVX @DPTR, A </code></p>
<p><code>; enable OC output </code></p>
<p><code>MOV DPTR, #PWMA_BKR </code></p>
<p><code>MOVX A, @DPTR </code></p>
<p><code>ORL A, #80H </code></p>
<p><code>MOVX @DPTR, A </code></p>
<p><code>; enable counter </code></p>
<p><code>MOV DPTR, #PWMA_CR1 </code></p>
<p><code>MOVX A, @DPTR </code></p>
<p><code>ORL A, #01H RET</code></p>
<p><code>PWMAISR: </code></p>
<p><code>PUSH ACC </code></p>
<p><code>PUSH DPH </code></p>
<p><code>PUSH DPL </code></p>
<p><code>MOV DPTR, #PWMA_SR1 </code></p>
<p><code>MOVX A, @DPTR </code></p>
<p><code>ANL A, #NOT 11H </code></p>
<p><code>MOVX @DPTR, A </code></p>
<p><code>POP DPL </code></p>
<p><code>POP DPH </code></p>
<p><code>POP ACC </code></p>
<p><code>RETI</code></p>
<p>这能有什么错?逐bit位配置</p>
<p>大神能不能翻译成C代码?</p>
网老四 发表于 2024-12-9 22:15
大神能不能翻译成C代码?
给你翻译完了,你看看呗
根据代码,以下是各个寄存器被设置的具体值:
P1M1:设置为 0BFH(二进制:10111111,十进制:191)。
P1M0:设置为 40H(二进制:01000000,十进制:64)。
对于以下寄存器,代码通过位操作设置了特定的位:
PWMA_PS:通过 ANL A, #NOT 0C0H 清除了累加器A中的 0C0H(二进制:11000000)对应的位,然后将结果写回。
PWMA_CCER2:首先通过 MOV A, #00H 清零累加器A,然后写入,禁用或清除相关功能。
PWMA_CCMR4:通过 ORL A, #78H 设置累加器A中的 78H(二进制:01111000)对应的位,然后写回。
PWMA_CR1:通过 ORL A, #84H 和 ANL A, #NOT 70H 分别设置了 84H(二进制:10000100)和清除了 70H(二进制:01110000)对应的位,然后写回。
PWMA_CCER2:通过 ORL A, #10H 设置累加器A中的 10H(二进制:00010000)对应的位,然后写回。
PWMA_CCR4H 和 PWMA_CCR4L:分别设置为 0FFH(二进制:11111111,十进制:255)和 0FH(二进制:00001111,十进制:15)。
PWMA_ARRH 和 PWMA_ARRL:分别设置为 0FFH 和 0FFH。
PWMA_IER:通过 ORL A, #11H 设置累加器A中的 11H(二进制:00010001)对应的位,启用中断。
PWMA_PSCRH 和 PWMA_PSCRL:通过 MOV A, #00H 清零累加器A,然后写入,禁用预分频。
PWMA_EGR:通过 ORL A, #01H 设置累加器A中的 01H(二进制:00000001)对应的位,触发事件。
PWMA_ENO:通过 ORL A, #40H 和 ANL A, #NOT 80H 分别设置了 40H 和清除了 80H 对应的位。
PWMA_IOAUX:通过 ORL A, #40H 设置累加器A中的 40H 对应的位。
PWMA_BKR:通过 ORL A, #80H 设置累加器A中的 80H(二进制:10000000)对应的位,启用OC输出。
PWMA_SR1:通过 ANL A, #NOT 11H 清除累加器A中的 11H 对应的位,清除中断标志。
这些设置配置了PWM模块的工作模式、周期、频率、中断等参数,以及I/O端口的功能,以实现特定的PWM输出。
VCC 发表于 2024-12-9 22:39
给你翻译完了,你看看呗
这是人工只能翻译的吧?{:lenghan:} 21cnsound 发表于 2024-12-9 23:02
这是人工只能翻译的吧?
当然了,这样才要用引用框算起来 <p>终于搞清楚了。 初始化部分,使能计数器对应的bit位之后,没有写回寄存器PWMA_CR1。</p>
<p>但配置PWM输出过程也太麻烦了,是不是有些配置对于PWM输出是没有用的?</p>
请参考厂家代码,初始化一路PWM就是十几行C代码。
页:
[1]