cnCalc计算器论坛

 找回密码
 注册
搜索
查看: 13802|回复: 25

[89/92/V200] Ti-68K简易C语言程序教程[课程1~4]

[复制链接]
发表于 2014-3-17 20:30:17 | 显示全部楼层 |阅读模式
本帖最后由 HHX-XXM 于 2014-6-14 17:53 编辑

首先说明一下:
本教程是根据: http://www.technoplaza.net/programming/ 改编,在此感谢原作者!!!
The lessons is adapted from http://www.technoplaza.net/programming/ ,Thanks to the original author!
撰写人:HHX-XXM (你可以叫我大傻逼)
  本教程部分或全部例题均由原作者程序改写
  因此教程产生的任何问题本人或原作者均不负责
  本人是渣渣,请保持不完全相信的心态阅读此文章,本文章高危内容切勿模仿!
然后目的:
     促使自己学习TI-GCC,本文章是边学边写的,可能更新有点慢(最起码比nbzwt快就是了ヾ(●゜ⅴ゜)ノ(6.14:现在是慢了?dsa_┬)))
     然后,其实这个教程就是变相翻译+修改,望原作者理解(实际上我都不知道原作者是谁,Techno Plaza?科技广场)

本教程不会提到任何有关C语言的常识性问题(比如说int a是什么意思),请读者自行学习C语言(作者的C语言也是THQ水平的).
由于表达问题 , 所以文中有一些文字可能出现句不达意的情况 , 欢迎跟帖反馈 .
如果等不及的话 , 可以去文章头提到的原作者网站去观赏 . 相对来说TI-GCC是比较简单的 , 上手很容易 .

我已经做好了被喷死的准备
让暴风雨来得更猛烈些吧!!(现在看来根本没有人看,雨点都没有)

课程一,课程二 : 3#
课程三 : 10#
课程四 : 12#

课程撰写直播: https://qing.wps.cn/l/3b2e77e937fb45ec8a91fdfcd41a7f8b  密码:ce0776f3 大家可以去围观,批注

P.S. 6.14:
             我很好骑吃死 为何加精
发表于 2014-3-17 20:34:11 | 显示全部楼层
为什么叫做大傻逼?新人不懂啊π_π还有。。。唉算了。

点评

恭喜嘉哥在我处理图片的时候抢占二楼,因为我在cncalc群里的ID就是大傻逼,而且名副其实  发表于 2014-3-17 20:37
 楼主| 发表于 2014-3-17 20:35:31 | 显示全部楼层
课程一 : 环境搭建
所需软件包地址:
安装方法:
先安装TIGCC然后安装TI-EMU
TIGCC安装过程中,仅有IDE选项是必选的,其他选填
TI-EMU是依靠GTK+,请确保自己安装了GTK+
TI-EMUTi-Gcc IDE的使用方法不多说了......

课程二 : 第一个Hello World程序
首先,这是所有编程教程都会介绍的一个最基本的程序----打印Hello World...本次例程也针对一个简单的程序做说明...
程序清单Hello World.c:
请注意,也许打开TIGCCIDE时候,新建源码会有一些自动填充的代码,我们不需要她,删除即可..
  1. #include <tigcclib.h>//必须的头文件

  2. void _main(void) {
  3.     ClrScr(); //清除屏幕内容
  4.     DrawStr(0, 0, "Hello, World!", A_NORMAL);  //在屏幕右上角显示字符串
  5.     ngetchx();  //等待按键
  6. }
复制代码

然后单击DeBug>Run,或者点击F9,保存文档,然后程序会自动启动Ti-Emu,然后选择OS,开启模拟器进行测试...或许会出现异常,请按下ESC键返回Home界面然后再次Run.
运行结果:
关于屏幕:
TI-89最高只能设置为159,99 她的屏幕尺寸是160x100
V200/TI-92+则是239,127,她的屏幕尺寸是240x128

最后一个参数是什么意思呢?
A_NORMAL是告诉编译器不要给绘制的字符串添加任何效果..其他参数请参考TIGCC的说明文档..
发表于 2014-3-17 20:58:14 来自手机 | 显示全部楼层
见到教程贴就进来了。。
发表于 2014-3-17 21:08:35 | 显示全部楼层
jiage嘉哥 发表于 2014-3-17 20:34
为什么叫做大傻逼?新人不懂啊π_π还有。。。唉算了。

呃。。。为什么不直接在一楼更新?
发表于 2014-3-17 23:10:28 | 显示全部楼层
顶一下,希望有更多的人来分享自己的学习心得,稍微整理一下就是很不错的新手教程了  
 楼主| 发表于 2014-3-17 23:40:49 来自手机 | 显示全部楼层
jiage嘉哥 发表于 2014-3-17 21:08:35

呃。。。为什么不直接在一楼更新?

......打字慢来自: Android客户端
发表于 2014-3-18 12:01:03 | 显示全部楼层
未命名.PNG


 楼主| 发表于 2014-3-18 17:51:54 | 显示全部楼层
诗诺比 发表于 2014-3-18 12:01

{:getlost:}大触
 楼主| 发表于 2014-3-19 21:08:30 | 显示全部楼层
课程三 : 按键输入
大家都知道,一个程序最必要的就是输入,而输入大部分是用键盘进行的(手机也是有虚拟键盘的说~)...上节课的HelloWorld.c程序中,已经出现了一个关于按键的函数 : ngetchx() , 我们现在来看一看她的具体的使用方法:
  1. #include <tigcclib.h>



  2. void _main(void)

  3. {

  4. clrscr();

  5. int key;  

  6. printf("Press Enter Key\n");

  7. printf("Press Esc Key to close\n");

  8. key = ngetchx();

  9. while(1)

  10. {

  11.   if(key == KEY_ENTER)

  12.   {

  13. printf("You pressed Enter Key\n");

  14. }

  15. else if(key == KEY_ESC)

  16. {

  17. break;

  18. }

  19. key = ngetchx();

  20. }

  21. }
复制代码
ngetchx函数会返回一个按键码 , KEY_开头的常量储存着它.
(要养成常看说明文档的习惯)
KEY_F1 = 268, KEY_F2 = 269, KEY_F3 = 270, KEY_F4 = 271, KEY_F5 = 272, KEY_F6 = 273, KEY_F7 = 274, KEY_F8 = 275, KEY_ESC = 264, KEY_QUIT = 4360, KEY_APPS = 265, KEY_SWITCH = 4361, KEY_MODE = 266, KEY_BACKSPACE = 257, KEY_INS = 4353, KEY_CLEAR = 263, KEY_VARLNK = 4141, KEY_CHAR = 4139, KEY_ENTER = 13, KEY_ENTRY = 4109, KEY_STO = 258, KEY_RCL = 4354, KEY_SIGN = 173, KEY_MATH = 4149, KEY_MEM = 4150, KEY_ON = 267, KEY_OFF = 4363
#define KEY_DIAMOND (PSEUDO_CONST_KBD (16384, 8192))
#define KEY_DIAMOND (PSEUDO_CONST_KBD (16384, 8192))
摘自 TIGCC文档
然后一些C语言的常识我就不说了
运行结果:
QQ图片20140318211841.jpg
ti 89
还有一个函数叫做 : kbhit() 用来检测键盘是否被点击 . 可以用while(!kbhit())来做不按下键盘就一直进行的死循环
然后就是本节课最后一个函数 : OSdequeue()
这个函数在处理别的东西的时候进行按键操作特别好用 , 用来做游戏是极好的
首先,请欣赏这段代码:(代码由原作者编写)


  1. #include <tigcclib.h>



  2. void _main(void) {

  3.     void *kbq = kbd_queue();

  4.     unsigned short key;

  5.     unsigned long count = 0;

  6.     clrscr();

  7.     printf("Please press a key.\n");

  8.     while (OSdequeue(&key, kbq)) {

  9.         print: %lu.\n", count);

  10.         ++count;

  11.     }

  12. printf("The keycode was %hu\n", key);

  13.     ngetchx();

  14. }
复制代码
然后让我们来剖析这个代码:
首先让我们来了解一个东西----按键序列
这个序列是在键盘被按下时存储在内存中的位置,系统会自动处理他们,所以我们需要做的只是将他们出队.按键序列是一个先进先出队列,任何一个东西先进入队列也是第一个出队的 . 系统已经为我们处理好了按键序列 , 我们仅仅需要自己检查队列而已...
void * kbq=kbd_queue();
一个无类型的指针 , 指针指向一个内存地址 , 可以理解为硬币的正反面 . (六合江山:就是一张纸,写着你们家门牌号。把这张纸交给杀手,你就完了。)
OSdequeue(&key,kbq);
由于坑爹的TIGCC,所以这个函数在我这里不能正常运行 , 大家理解为从按键序列中获取按键码就可以了(能跑了将修改此部分)(注意阅读文档而获得更详细的帮助和支持)

 楼主| 发表于 2014-3-26 17:39:33 | 显示全部楼层
本帖最后由 HHX-XXM 于 2014-4-16 12:13 编辑

第九周期中考
最近抓紧学习中
恕我不能更新(差不多周六周日有可能...QQ还是能上的)
没人啊。。。

点评

比nbzwt慢了www  发表于 2014-5-23 17:49
 楼主| 发表于 2014-5-25 15:44:57 | 显示全部楼层
课程四:屏幕操作
一个程序光靠命令行来进行交互操作是不现实的,想要程序做的好,必定要有一个好看的GUI,以便进行操作。
身为一个为计算器设计的语言,里面已经集成了绘图函数。
而且使用方法很简单。
首先我们来熟悉几个常量:
LCD_WIDTH和LCD_HEIGHT
这两个常量分别代表了长度和宽度
在TI-89上面,显示屏是160*100的,TI-92和V200则是240*128的
对于TI-89,LCD_WIDTH就是160,LCD_HEIGHT就是100
TI-92/V200同理
下面我们来了解一下第一个函数:
DrawLine
这个函数的目的就是画一条线
她有五个参数:
DrawLine(x1,x2,y1,y2,绘制方式)
同样,我们的方式依旧是A_NORMAL,其他方式请阅读TI-GCC说明文档
比如,在2,2和22,22的地方画一条线,可以采用:
DrawLine(2,2,22,22,A_NORMAL);
原文中提到了一个
x1 = random(LCD_WIDTH);
这个就不多解释了,随机数的意思

那么,下面我们来进行第二个函数的学习
我们来认识一个新概念----精灵
精灵是个好东西,很多游戏开发软件(如Gamemaker)中通常都有这个说法
TIGCC也为我们准备了三个函数来绘制精灵
她们是:
{Sprite8 , Sprite16 , Sprite32}
这三个函数是用来在屏幕上绘制精灵的函数
让我们来看一个示例:
  1. #include <tigcclib.h>



  2. unsigned char S1[] = {0x3C,0x42,0x42,0x7E,0x42,0x42,0x42,0x42};

  3. unsigned short int S2[] =

  4. {

  5. 0xFFFF,0x8001,0xBFFD,0xA005,0xAFF5,0xA815,0xABD5,0xAA55,0xAA55,0xABD5,0x        A815,0xAFF5,0xA005,0xBFFD,0x8001,0xFFFF

  6. };

  7. unsigned long int S3[] = {

  8. 0x00000000,0x00000000,0x00000000,0x00000000,        0x00000000,0x00000000,0x00E07000,0x01FE7F80,        0x03FEFF80,0x07B9CE00,0x03188E00,0x03FFFF00,        0x01FFFF00,0x01C00700,0x01FFFF00,0x01C00700,        0x01FFFF00,0x01C00700,0x01FFFF00,0x01FFFF00,        0x00383800,0x07FFFFC0,0x07FFFFC0,0x00703800,        0x00F03800,0x01E03800,0x00403800,0x00000000,        0x00000000,0x00000000,0x00000000,0x00000000

  9. };

  10. void _main(void)

  11. {

  12. ClrScr();

  13. Sprite8(10,20,8,S1,LCD_MEM,SPRT_XOR);

  14. Sprite16(30,20,16,S2,LCD_MEM,SPRT_XOR);

  15. Sprite32(60,20,32,S3,LCD_MEM,SPRT_XOR);

  16. ngetchx();

  17. }
复制代码
运行结果如下:

下面就让我们来剖析这个程序
首先,在程序的开头我们定义了三个变量:S1,S2,S3
它们分别为”Unsigned Char”,”Unsigned short int”和”Unsigned long int”
这三个变量储存着三个不同的精灵(8x8        16x16        32x32)
然后通过程序中的
Sprite8(10,20,8,S1,LCD_MEM,SPRT_XOR);
        Sprite16(30,20,16,S2,LCD_MEM,SPRT_XOR);
        Sprite32(60,20,32,S3,LCD_MEM,SPRT_XOR);
这三个函数绘制在屏幕上
那么怎么把图片(点阵图)变成精灵的数据呢?
很简单
有过单片机开发经验的朋友都知道,有一种软体叫做字符取模
也就是将图片变成C51格式的字符串
这个软体我会在帖子结尾上传
下面是软件截图:
也许大家就要问了
为什么我把一个32x3216x16的图片取模后和我的格式不一样呢?
这是由于Sprite16Sprite32的函数只能接受这种格式
可以手动将
  1. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  2. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x70,0x00,0x01,0xFE,0x7F,0x80,

  3. 0x03,0xFE,0xFF,0x80,0x07,0xB9,0xCE,0x00,0x03,0x18,0x8E,0x00,0x03,0xFF,0xFF,0x00,

  4. 0x01,0xFF,0xFF,0x00,0x01,0xC0,0x07,0x00,0x01,0xFF,0xFF,0x00,0x01,0xC0,0x07,0x00,

  5. 0x01,0xFF,0xFF,0x00,0x01,0xC0,0x07,0x00,0x01,0xFF,0xFF,0x00,0x01,0xFF,0xFF,0x00,

  6. 0x00,0x38,0x38,0x00,0x07,0xFF,0xFF,0xC0,0x07,0xFF,0xFF,0xC0,0x00,0x70,0x38,0x00,

  7. 0x00,0xF0,0x38,0x00,0x01,0xE0,0x38,0x00,0x00,0x40,0x38,0x00,0x00,0x00,0x00,0x00,

  8. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
复制代码
这种格式转化为
  1. 0x00000000,0x00000000,0x00000000,0x00000000,        0x00000000,0x00000000,0x00E07000,0x01FE7F80,        0x03FEFF80,0x07B9CE00,0x03188E00,0x03FFFF00,        0x01FFFF00,0x01C00700,0x01FFFF00,0x01C00700,        0x01FFFF00,0x01C00700,0x01FFFF00,0x01FFFF00,        0x00383800,0x07FFFFC0,0x07FFFFC0,0x00703800,        0x00F03800,0x01E03800,0x00403800,0x00000000,        0x00000000,0x00000000,0x00000000,0x00000000
复制代码
这种格式
也就是把四个一个字节的数据合并成为一个四个字节的数据.
然后我们来正式介绍着三个函数
SpriteXX函数接受6个参数
分别是:
x位置 , y位置 , 图像高度 , 图像数据 , 显存指针 , 绘制方法
Xy位置自然不用说
图像高度就是精灵中图像的高度(图像宽度就是SpriteXX中的XX)
图像数据从Sprite8Sprite32分别为:
无符号的字符数组,无符号的短整型数组,无符号的长整形数组
至于显存指针,您只需要记住:
当前屏幕的显存指针通常就是 LCD_MEM
(除非您是想将精灵绘制到其他的地方,我们或许在以后的课程中提到)
下面,让我们来看一看绘制方法:
我推荐大家使用的绘制方法是SPRT_XOR
也就是说异或
下面通过一组代码您会充分认识到这个绘制方法的好处:
首先我们定义
unsigned char S4[] = {0x18,0x18,0x18,0xFF,0xFF,0x18,0x18,0x18};
unsigned char S5[] = {0xC3,0x66,0x24,0x00,0x00,0x24,0x66,0xC3};


   
Sprite8(1,1,8,S4,LCD_MEM,SPRT_XOR);

Sprite8(1,1,8,S5,LCD_MEM,SPRT_XOR);

Sprite8(1,1,8,S4,LCD_MEM,SPRT_XOR);
您会发现:
第一句代码和第二句代码一模一样
为什么会产生不同的效果呢?
这是因为我们使用了SPRT_XOR
这个绘制方法是很好用的
如果绘制的地方没有像素点,那么就绘制一个像素点
如果绘制的地方已经有了一个像素点,那么就抹掉一个像素点
这就是我为什么推荐这个绘制方法
很好用,而且很方便
更多的方法请翻阅GUIDE,谢谢


    P.S. 我死灰复燃了

发表于 2014-7-25 02:44:30 | 显示全部楼层
你弃坑了吗
发表于 2014-7-25 09:52:04 | 显示全部楼层
再来顶顶大傻逼

点评

↓Σ(  ̄д ̄;) 你!!  发表于 2014-7-26 13:29
大傻逼已经退出论坛了  发表于 2014-7-26 05:42
发表于 2014-12-16 12:29:37 | 显示全部楼层
普通92可以用吗?另外下载链接跪了
发表于 2014-12-17 21:19:23 | 显示全部楼层
恭喜再上首页
(吃我一记洛阳铲
发表于 2014-12-17 22:18:25 | 显示全部楼层
在电脑上做的,还是ti里做的。如何给ti装编译器。
发表于 2014-12-17 22:42:01 | 显示全部楼层
HHX-XXM 发表于 2014-5-25 15:44
课程四:屏幕操作
一个程序光靠命令行来进行交互操作是不现实的,想要程序做的好,必定要有一个好看的GUI ...

就喜欢教程,写的好,就是图片不显示.
发表于 2014-12-19 16:30:13 | 显示全部楼层
请问这是直接在计算器上就能编程的吗。
 楼主| 发表于 2015-2-1 18:33:39 | 显示全部楼层
randomzoom 发表于 2014-12-17 22:18
在电脑上做的,还是ti里做的。如何给ti装编译器。

这个是在电脑上做的,但是ti里面也可以
具体情况请在本论坛寻找ti68k的机上编译器
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cnCalc计算器论坛

GMT+8, 2024-4-24 22:25 , Processed in 0.087222 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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