“忙得连写blog的时间都没有了”

作者近两个月忙得无暇写博客,将时间花在更重要的事上。先是阅读难找的书,如Maxwell Perkins书信集;接着忙着写书稿,已有雏形;还花三周画八张漫画用于书中,首次尝试全电脑无纸化操作。最后汇报工作并总结思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

印象里,熊节形容某人特别忙的时候,喜欢说那人“忙得连写blog的时间都没有了”。我以前对这句话并没有太多的感触,这两个月忙下来,才知道自己也掉进了这个不写blog的怪圈——两个月里,我甚至连到blog上看一眼的工夫都挤不出来了,更别说写blog了。

其实,我只把自己的blog当作一个记录心情以便与大家交流的公开的日记本,以前多半遵循着有感觉就写两篇,没感觉也不必无病呻吟的原则,写写停停,blog上倒也没有落下大段时间的空白。可这两个月的情形就完全不同了,许多时候我是肚子里积攒了不少话想说出来的,但就是没心情写blog,因为一坐在计算机前,我就条件反射似地想起,还有其他许多更重要的事情没有做完,哪里就轮到把时间花在这可有可无的blog上了呢?

但话说回来,“忙”在大多时候也只是一种心情或一种借口罢了。像我这样的凡夫俗子,再怎么忙,也不会忙到像美国总统或者演艺明星那样需要由助手来安排和管理时间的地步。我说这两个月忙,那多半意味着我在这两个月里还能找到些自己喜欢的事情来做;要是哪天我说自己不忙了,那差不多就可以证明,我已经彻底向芸芸众生最为津津乐道的低级趣味(昨天刚学了个英文词组叫the voluptuous worldlings)缴械投降了。也就是说,“忙得连写blog的时间都没有了”这句话对我来说,必须翻译成“因为鼓捣着其他更带劲儿的事情而没有心情挤时间写blog了”。

所谓“更带劲儿的事情”,这也只能相对于我自己而言。我喜欢的不一定你就喜欢,你喜欢的不一定他就喜欢。人活在世上,能喜欢着自己的喜欢,而又不强求他人成为自己的同好,这也许才是最大的幸福吧?——算了,还是说说我这两个月都忙了些什么吧。

首先是找到了几本难找的书,然后就自然而然地把大块的时间扔在了比写blog重要十倍的“阅读”这件事上。比如说,我从国图里借出了Maxwell Perkins的书信集——Perkins这哥们儿是美国好几代编辑人的崇拜对象,光把他亲手发掘、编辑和培养过的作家名单写在这里...Conrad Aiken, Erskine Caldwell, F. Scott Fitzgerald, Ernest Hemingway, Ring Lardner, John P. Marquand, Thomas Wolfe...就够唬人的了,他的书信集当然是熟悉他的思想,了解他的工作方法的最好渠道了——然后,我就像《西游记》里听禅悟道的猴子那样“抓耳挠腮,眉花眼笑,忍不住手之舞之,足之蹈之”了好一阵子。

其次是忙着写一份书稿——既然已经答应了出版社,就应当拿出些言必信、行必果的劲头来——两个月里,我不知在电脑前发了多少次呆,也不知在丑末寅初时揉了多少回眼,到这会儿,终于有些雏形可以交给出版社的编辑们“砍削割锯”了,才多少松了一口气(离问世还早,书名和内容大家就先别问了吧,等到了合适的时间,我自然会在网上鼓噪宣传的)。

更费劲的是,为了给这本书里增加些“天花乱坠,地涌金莲”的妙处,我又花了三周的时间,画了八张大幅面全彩色的漫画,准备印在书中各章的开头。想来有人会说,这些漫画恐怕又是些哗众取宠、喧宾夺主的东东。让他说去吧,我自己还是会乐此不疲的:一方面,画画儿是我自己的业余爱好之一,虽然没经过专业训练,但偶尔动动笔也多少会有些愉悦身心的功效;另一方面,让技术书籍尽量轻松、活泼也是我自己始终追寻的大方向,绝不是哪个人动动舌头就可以让我改变初衷的。

顺便多说一句,画这八幅漫画时,我第一次学着某些专业电漫师的样子,实现了全电脑的无纸化操作。一个WACOM的绘画板,配上Painter和Photoshop这两种软件,最终的结果还是可以让自己满意的(毕竟自己只是业余水平嘛)。只不过,当初为了省钱,我没有按专家的建议选择WACOM的专业绘画板,而是买了WACOM的入门级产品430,画起画来,手上的感觉多少有些异样。

好了,就唠叨到这儿吧。两个月来的第一篇blog,全当是给大家汇报一下工作状况,总结一下思想认识。但愿今后总能处在“忙”的状态里,同时也总能抽出时间在blog上唠叨几句。

<think>我们正在讨论LCD12864 ST7920显示屏的忙信号检测程序。忙信号检测是液晶模块编程中的重要部分,用于确保在发送新命令前,模块已完成当前操作。 根据ST7920的数据手册,我们可以通过读取状态字(Status Byte)来检测忙信号。状态字的最高位(DB7)是忙标志位:当DB7=1时,表示模块正在处理内部操作,此时不能接受新的指令;当DB7=0时,表示模块已准备好接受新指令。 硬件连接上,通常使用8位并行接口(或4位,但忙检测时通常需要8位数据线)和RS(寄存器选择)、RW(读写选择)、E(使能)信号线。在读取状态字时,需要设置RS=0(选择指令寄存器),RW=1(读操作),然后使能E信号。 以下是一个典型的忙检测程序步骤(以8位并行接口为例): 1. 设置数据线为输入模式(因为我们要读取模块的状态)。 2. 设置RS=0(选择指令寄存器)。 3. 设置RW=1(读操作)。 4. 使能E信号(高电平)。 5. 读取数据线的高8位(即状态字)。 6. 禁用E信号(低电平)。 7. 检查状态字的最高位(DB7)是否为0(表示不忙),如果为1则重复上述步骤直到不忙。 8. 将数据线重新设置为输出模式(如果后续操作是写命令或数据)。 注意:在4位并行接口模式下,状态字需要分两次读取(先高4位,后低4位),但忙标志位在第一个高4位中(即DB7~DB4),因此我们通常只需要读取高4位即可判断忙状态。 下面我们分别给出8位和4位模式下的忙检测程序示例。 8位模式忙检测函数(C语言): ```c void CheckBusy(void) { unsigned char busy; // 设置数据端口为输入 DATA_DDR = 0x00; // 假设DATA_DDR是控制数据端口方向的寄存器,设为输入 // 设置控制信号:RS=0, RW=1 CTRL_PORT &= ~(1<<RS); // RS置0 CTRL_PORT |= (1<<RW); // RW置1 do { // 使能E CTRL_PORT |= (1<<E); // E置1 // 读取数据端口(状态字) busy = DATA_PIN; // 假设DATA_PIN是数据输入寄存器 // 取消使能E CTRL_PORT &= ~(1<<E); // E置0 // 检查忙标志位(最高位,通常为0x80) } while (busy & 0x80); // 当最高位为1时,继续等待 // 恢复数据端口为输出(如果后续操作需要写) DATA_DDR = 0xFF; // 设置为输出 } ``` 4位模式忙检测函数(C语言): 在4位模式下,我们只需要读取高4位(即第一个4位)就可以获取忙标志位(DB7)和地址计数器(DB6~DB4)等信息。忙标志位在第一个4位数据的最高位(即DB7,对应我们读取的第一个4位数据的最高位)。 注意:4位模式下,数据分两次传输,每次传输4位,但忙检测时我们只关心第一个4位(高4位)的忙标志。 ```c void CheckBusy4Bit(void) { unsigned char highNibble; // 设置高4位数据线为输入,低4位我们暂时不关心(但为了安全,可以设置为输入,或者根据硬件连接只使用高4位) // 假设我们的数据线高4位连接在D4-D7(实际硬件连接可能不同,这里以高4位为例) // 设置数据端口方向:高4位输入,低4位输出(或输入,但这里我们只使用高4位) // 注意:具体设置取决于硬件连接,这里假设数据端口的高4位用于数据传输,低4位未使用或同样连接(但4位模式一般只使用4根数据线) // 实际上,4位模式下,我们通常将4根数据线连接到微控制器的高4位或低4位,这里假设我们使用高4位(D4-D7)作为数据线。 // 因此,设置高4位为输入,低4位可以设置为输入或输出(但为了避免影响,通常设置为输入或保持原状,但这里我们只关注高4位) DATA_DDR &= 0x0F; // 将高4位设为输入(0),低4位保持不变(或者根据需要,这里假设低4位我们不用,所以设为输入) // 设置控制信号:RS=0, RW=1 CTRL_PORT &= ~(1<<RS); // RS=0 CTRL_PORT |= (1<<RW); // RW=1 do { // 使能E CTRL_PORT |= (1<<E); // 读取高4位(数据线的高4位) highNibble = DATA_PIN & 0xF0; // 获取高4位(假设高4位在数据端口的D4-D7,所以与0xF0) // 取消使能E CTRL_PORT &= ~(1<<E); // 注意:在4位模式下,我们不需要读取低4位,因为忙标志位在高4位中已经包含了(DB7在第一个高4位中) } while (highNibble & 0x80); // 检查高4位的最高位(DB7)是否为1(忙) // 恢复数据端口方向(如果需要写,则设置为输出) DATA_DDR |= 0xF0; // 将高4位设为输出(1),低4位保持不变(如果低4位是其他用途,则不需要改变) } ``` 注意:以上代码中的寄存器操作(如DATA_DDR, DATA_PIN, CTRL_PORT)需要根据具体的硬件连接和微控制器型号进行修改。另外,控制信号线(RS, RW, E)的位也需要根据实际连接调整。 在编写忙检测程序时,还需要注意: - 延时:在读取状态字之前,可能需要短暂的延时(特别是在高速微控制器上),以确保信号稳定。但ST7920的数据手册中规定了使能信号E的最小脉宽(通常几百纳秒),一般微控制器的操作速度可以满足,但如果微控制器速度很快,可能需要加入小延时。 - 超时:为了避免死循环,可以加入超时机制(例如,循环超过一定次数后退出,并报错)。 因此,我们可以改进上述函数,加入超时检测: ```c #define BUSY_TIMEOUT 10000 // 超时计数,根据实际情况调整 int CheckBusyWithTimeout(void) { unsigned int timeout = BUSY_TIMEOUT; unsigned char busy; // 设置数据端口为输入 DATA_DDR = 0x00; CTRL_PORT &= ~(1<<RS); // RS=0 CTRL_PORT |= (1<<RW); // RW=1 do { CTRL_PORT |= (1<<E); busy = DATA_PIN; CTRL_PORT &= ~(1<<E); if (--timeout == 0) { // 超时,返回错误 // 恢复数据端口为输出 DATA_DDR = 0xFF; return -1; // 返回错误码 } } while (busy & 0x80); DATA_DDR = 0xFF; return 0; // 成功 } ``` 以上代码提供了一个基本的忙检测函数,并考虑了超时情况。在实际应用中,需要根据具体的硬件和需求进行调整。 希望这些信息能帮助你编写LCD12864 ST7920的忙检测程序。 相关问题: 1. 如何优化LCD12864 ST7920的忙检测以提高效率? 2. 在4位并行模式下,如何正确读取和写入数据? 3. LCD12864 ST7920的忙检测失败可能有哪些原因?</think>### LCD12864 ST7920忙信号检测程序详解 忙信号检测是LCD12864 ST7920驱动中的关键操作,用于确保模块完成内部操作后再接收新指令。以下是详细实现方法: #### 忙信号检测原理 1. **状态字结构**:ST7920的状态字最高位(DB7)是忙标志位: - `DB7=1`:模块忙,禁止接收新指令 - `DB7=0`:模块就绪,可接收新指令 - 状态字格式:`1xxxxxxx`(忙)或`0xxxxxxx`(就绪)[^1] 2. **硬件连接要求**: - RS(寄存器选择)=0(选择指令寄存器) - RW(读写选择)=1(读操作) - E(使能信号)需要高脉冲触发读取 #### 8位并行模式检测程序(C语言) ```c #include <stdbool.h> // 引脚定义(根据实际连接修改) #define LCD_RS_PIN 0 #define LCD_RW_PIN 1 #define LCD_E_PIN 2 #define DATA_PORT PORTA #define DATA_DDR DDRA #define DATA_PIN PINA // 忙检测函数 bool LCD_BusyCheck() { // 设置数据端口为输入 DATA_DDR = 0x00; // 设置控制信号:RS=0, RW=1 PORTB &= ~(1 << LCD_RS_PIN); PORTB |= (1 << LCD_RW_PIN); // 使能脉冲 PORTB |= (1 << LCD_E_PIN); _delay_us(1); // 保持时间 > 230ns // 读取状态字(最高位为忙标志) bool busy = (DATA_PIN & 0x80); PORTB &= ~(1 << LCD_E_PIN); // 结束使能 // 恢复数据端口为输出 DATA_DDR = 0xFF; return busy; // 返回忙状态 } // 使用示例 void LCD_WriteCommand(uint8_t cmd) { while(LCD_BusyCheck()); // 等待就绪 // ... 发送命令代码 ... } ``` #### 4位并行模式检测程序 ```c bool LCD_BusyCheck4Bit() { // 设置高4位为输入 DATA_DDR &= 0x0F; PORTB &= ~(1 << LCD_RS_PIN); PORTB |= (1 << LCD_RW_PIN); // 读取高4位(包含忙标志) PORTB |= (1 << LCD_E_PIN); _delay_us(1); bool busy = (DATA_PIN & 0x80); // D7位即忙标志 PORTB &= ~(1 << LCD_E_PIN); // 恢复高4位为输出 DATA_DDR |= 0xF0; return busy; } ``` #### 关键注意事项 1. **时序要求**: - E使能脉冲宽度 > 230ns - 数据建立时间 > 140ns - 检测间隔建议 > 40μs(ST7920最慢指令周期) 2. **优化建议**: ```c // 带超时的忙检测 #define BUSY_TIMEOUT 10000 // 约10ms超时 void LCD_WaitReady() { uint16_t timeout = BUSY_TIMEOUT; while(LCD_BusyCheck() && timeout--); if(timeout == 0) { // 超时错误处理 } } ``` 3. **硬件设计要点**: - 数据线上拉电阻(4.7KΩ) - E信号线加100Ω串联电阻防震荡 - 避免长走线(总线长度 < 20cm) #### 常见问题排查 1. **始终检测为忙**: - 检查RW引脚是否设置为高电平 - 验证数据端口方向寄存器配置 - 测量E信号脉冲宽度(示波器) 2. **随机检测失败**: - 增加`_delay_us(5)`在E信号跳变后 - 检查电源电压稳定性(5V±0.5V) - 添加去耦电容(0.1μF靠近VDD引脚) > 实际应用参考:工业控制系统中使用12864显示传感器数据时,忙检测可确保数据刷新同步[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值